【问题标题】:RTP packet drop issue(?)RTP 丢包问题(?)
【发布时间】:2015-10-12 18:27:13
【问题描述】:

我有一个客户端和一个服务器,服务器通过封装在 UDP 中的 RTP 数据包发送音频数据。客户端接收数据包。由于 UDP 没有流量控制,客户端会检查数据包的序列号,如果出现乱序则重新排列它们。 我的问题是,我看到客户端永远不会收到带有某些序列号的数据包,如下面的 wireshark -

如果是这种情况,当我在客户端播放音频时,它会失真(很明显)。我该如何避免?哪些因素会影响这些?我应该将套接字缓冲区大小设置为较大的值吗?

提前感谢回复。
编辑 1:这个问题是在 QNX 平台上而不是在 Linux 上。 我观察了“netstat -p udp”的输出,看看它是否给出了关于为什么包在 QNX 而不是在 Linux 上被丢弃的任何提示。

QNX:

SOCK=/dev/d_usb3/ netstat -p udp 
 udp:
 8673 datagrams received
 0 with incomplete header
 60 with bad data length field
 0 with bad checksum
 0 dropped due to no socket
 2 broadcast/multicast datagrams dropped due to no socket
 0 dropped due to full socket buffers
 8611 delivered
 8592 PCB hash misses

在 Linux 上,我看到 netstat 显示相同服务器和相同音频没有丢包!

有什么线索吗?为什么会这样?驱动问题?网络堆栈?

【问题讨论】:

  • 这取决于您的架构/驱动程序。 RTP 没有定义任何特定的机制来恢复丢失的数据包。该机制取决于基于 RTP 标头中可用信息的体系结构。您能否分享有关您的设计的更多信息。

标签: c sockets udp audio-streaming rtp


【解决方案1】:

您需要指定在客户端中如何处理丢失的数据包。

如果您丢失数据包,则意味着您的音频流中缺少数据。因此,您的客户必须在缺少数据的地方“做某事”。一些选项是 - 播放静音(由于尖锐的包络到 0 会发出破裂的噪音) - 淡入静默 - 通过检查相邻数据估计波形 - 播放噪音

您播放不能错位数据包或使用丢失的数据包播放它们。例如,假设您获得了数据包 1、2、3、4 和 6。您缺少数据包 5。您无法播放数据包 4,然后播放数据包 6。必须发生一些事情来填充数据包 5 的空间。

See this post for more info.

【讨论】:

    猜你喜欢
    • 2015-05-31
    • 2018-04-28
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2015-11-28
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多