首页 > 解决方案 > 如何获取通过 TCP 传输的 RTP 有效负载(关于删除标头)

问题描述

我正在设置一种媒体播放器。我想在 TCP 数据包中获取 RTP 数据以进行媒体播放。

为了获取数据,我应该删除标题部分。我找到了两种方法。

方式[1] TCP数据包

[$ - 1byte][Transport Channel - 1byte][RTP data length - 2bytes][RTP data]

方式[2] TCP数据包

在 rfc4571 标准 ( https://www.rfc-editor.org/rfc/rfc4571#page-3 )

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
---------------------------------------------------------------
|             LENGTH            |  RTP or RTCP packet ...     |
---------------------------------------------------------------

我找到了两个tcp数据包结构。因此,如果我遵循方式 [1],我应该删除 4 个字节(1+1+2),但方式 [2],我应该只删除 2 个字节。

实际上,我以 [1] 的方式实现我的程序,但在 gst-plugins-good 中,rtpstreamdepay 插件实现它遵循 [2] 和 Android 的方式。

那么删除 2 个字节是正确的吗?还是旧标准和新标准?

标签: tcpudpgstreamerrtp

解决方案


如果我没记错的话,您在这里看到的是两种不同的东西。

方式1:表示RTSP交织。因此,所有 RTP/RTCP 通道都通过 RTSP 控制连接传输。由于在这种情况下您正在处理单个连接,因此您需要附加信息,您发送的数据属于哪个通信通道。

方式2:只是UDP数据的TCP帧。由于 TCP 是一个连续流,因此您会丢失 UDP 数据报提供的隐式长度信息。由于协议本身没有这样的信息,因此在实际有效载荷之前由一个 16 位长度的字段提供。


推荐阅读