RTP数据包丢弃问题(?)

时间:2015-10-12 18:27:14

标签: c sockets udp audio-streaming rtp

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

wireshark showing packet loss

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

提前回复 编辑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显示没有丢弃具有相同服务器和相同音频的数据包!

任何线索?为什么会这样?司机问题?网络堆栈?

1 个答案:

答案 0 :(得分:0)

您需要指定在客户端处理丢失数据包的方式。

如果丢失数据包,则表示您的音频流中缺少数据。因此,您的客户必须做某事"它缺少数据的地方。有些选择 - 播放沉默(由于尖锐的信封而产生裂缝噪音为0) - 淡化沉默 - 通过检查相邻数据来估计波形 - 播放噪音

您播放时不能错位数据包或播放丢失的数据包。例如,假设您收到了数据包1,2,3,4和6.您丢失了数据包5.您无法播放数据包4然后播放数据包6.必须要填充数据包5的空间。

See this post for more info.