单个 UDP 数据报中的 RTP 数据包数
Number of RTP packets in a single UDP datagram
我正致力于在嵌入式 MCU (STM32F4) 上实现 RTP,但我在高效流式传输音频数据(8 kHz,u-law 编码)时遇到了问题。
对于分块音频数据(20 毫秒,160 字节)我应该:
- 通过单个 UDP 数据报发送单个 RTP 数据包(12 字节 header + 160 字节音频),或
- 通过单个 UDP 数据报发送多个 RTP 数据包(因为我们可以在单个 UDP MTU 中容纳多个)
如果 (2),则单个 UDP 数据报中的每 160 字节音频数据应该有一个 RTP header。例如,5 个 RTP 数据包将是 800 字节的音频数据 - 我会发送:
- RTP_Header->Audio_data(160字节)->RTP_Header->Audio_data(160字节)->RTP_Header->Audio_data (160 字节)...
- RTP_Header->Audio_data(800 字节)
使用 LinPhone 作为客户端进行测试时,我注意到多个超时数据包以及从我对着嵌入式设备说话到在 Linphone 上听到它之间的短暂延迟;而且我正在尝试追踪通过 UDP 更有效地流式传输数据是否会修复它。当我对着 LinPhone 说话和从我的嵌入式设备播放时,我没有同样的延迟,事实证明,这两者之间的延迟很难在嵌入式 MCU 上消除回声。
鉴于 RTP 用于实时数据并且每个 RTP 有效载荷用于特定时间,因此将多个 RTP 数据(来自不同时间)组合到同一个 UDP 数据包中是没有意义的。这意味着每个 RTP 负载都以 RTP header 为前缀,然后立即通过 UDP 发送。
我正致力于在嵌入式 MCU (STM32F4) 上实现 RTP,但我在高效流式传输音频数据(8 kHz,u-law 编码)时遇到了问题。
对于分块音频数据(20 毫秒,160 字节)我应该:
- 通过单个 UDP 数据报发送单个 RTP 数据包(12 字节 header + 160 字节音频),或
- 通过单个 UDP 数据报发送多个 RTP 数据包(因为我们可以在单个 UDP MTU 中容纳多个)
如果 (2),则单个 UDP 数据报中的每 160 字节音频数据应该有一个 RTP header。例如,5 个 RTP 数据包将是 800 字节的音频数据 - 我会发送:
- RTP_Header->Audio_data(160字节)->RTP_Header->Audio_data(160字节)->RTP_Header->Audio_data (160 字节)...
- RTP_Header->Audio_data(800 字节)
使用 LinPhone 作为客户端进行测试时,我注意到多个超时数据包以及从我对着嵌入式设备说话到在 Linphone 上听到它之间的短暂延迟;而且我正在尝试追踪通过 UDP 更有效地流式传输数据是否会修复它。当我对着 LinPhone 说话和从我的嵌入式设备播放时,我没有同样的延迟,事实证明,这两者之间的延迟很难在嵌入式 MCU 上消除回声。
鉴于 RTP 用于实时数据并且每个 RTP 有效载荷用于特定时间,因此将多个 RTP 数据(来自不同时间)组合到同一个 UDP 数据包中是没有意义的。这意味着每个 RTP 负载都以 RTP header 为前缀,然后立即通过 UDP 发送。