tcp - 如何获取通过 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 个字节是正确的吗?还是旧标准和新标准?
解决方案
如果我没记错的话,您在这里看到的是两种不同的东西。
方式1:表示RTSP交织。因此,所有 RTP/RTCP 通道都通过 RTSP 控制连接传输。由于在这种情况下您正在处理单个连接,因此您需要附加信息,您发送的数据属于哪个通信通道。
方式2:只是UDP数据的TCP帧。由于 TCP 是一个连续流,因此您会丢失 UDP 数据报提供的隐式长度信息。由于协议本身没有这样的信息,因此在实际有效载荷之前由一个 16 位长度的字段提供。
推荐阅读
- javascript - 无法从类中调用方法,可能是上下文问题。以及如何制作 SlideBox auto 的固定尺寸?
- amazon-cloudwatch - AWS CloudWatch 客户端日志记录
- linux - 如何将十六进制作为参数插入 gdb?(作为 arg,而不是标准输入)
- node.js - 如何使用 Node.js 在 Windows 中创建 git 挂钩?
- r - 有没有办法在 R 中实现 Xorshift32 算法?
- android - Android 4.2 Material TextInputLayout 提示未在 rtl 模式下显示
- javascript - 如何在camelcase中转换api响应ekey值
- flutter - 如何在 Flutter 中旋转小部件?
- firebase - 如何在 CSV 报告中使用自定义参数查看 Firebase 事件分析?
- unit-testing - 如何在 Grails 单元测试中多次调用 request.JSON?