【发布时间】:2020-03-12 09:10:21
【问题描述】:
我正在致力于在嵌入式 MCU (STM32F4) 上实现 RTP,但在高效流式传输音频数据(8 kHz,u-law 编码)时遇到了问题。
对于分块音频数据(20 毫秒,160 字节),我应该:
- 通过单个 UDP 数据报发送单个 RTP 数据包(12 字节标头 + 160 字节音频),或
- 通过单个 UDP 数据报发送多个 RTP 数据包(因为我们可以在单个 UDP MTU 中容纳多个)
如果(2),那么在单个 UDP 数据报中每 160 字节的音频数据是否应该有一个 RTP 头。例如,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 上消除回声。
【问题讨论】:
-
请澄清:实施 1 或 2 是否会出现超时数据包和音频延迟?我根本不希望实现 2 起作用。
-
通过实施 1。语音延迟似乎通过切换到不同的网络堆栈(NetX 而不是 LwIP)来解决。仍然收到一些 Out of Time 数据包,但几乎没有。你是对的,实施 2 不起作用。