我有一个客户端和一个服务器,服务器通过封装在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显示没有丢弃具有相同服务器和相同音频的数据包!
任何线索?为什么会这样?司机问题?网络堆栈?
答案 0 :(得分:0)
您需要指定在客户端处理丢失数据包的方式。
如果丢失数据包,则表示您的音频流中缺少数据。因此,您的客户必须做某事"它缺少数据的地方。有些选择 - 播放沉默(由于尖锐的信封而产生裂缝噪音为0) - 淡化沉默 - 通过检查相邻数据来估计波形 - 播放噪音
您播放时不能错位数据包或播放丢失的数据包。例如,假设您收到了数据包1,2,3,4和6.您丢失了数据包5.您无法播放数据包4然后播放数据包6.必须要填充数据包5的空间。