前面文中描述了打包格式为RTP,负载为G.711的音频流的分析方法。
并且得知了设备收到的RTP流有严重的乱序情况。
那么,发送端发出的流是正常的,接收端收到的流却乱序严重,这是什么原因呢?
一、查看路由
linux命令行输入 tracert -d 目的IP
二、发送端要增加VBV控制发送速度
有的发送端并不控制发送速度,UDP本身并不是可靠连接,发送速度不均匀、过快,会导致接收端丢包或者乱序。
这个也很好验证,可以让发送端给一台PC发,如果PC收到的RTP包也有丢包或者乱序的情况,则说明发送端有问题。
解决的办法就是在发送端加入VBV处理,控制发送速度,尽量保持匀速发送。
在加入音频的VBV控制之后,每20ms左右发送一个G.711包(负载为160字节,20ms一帧的音频数据),音频包乱序率从40%降低到2%左右了。
三、接收端要增加重排序功能
虽然乱序率降低到2%左右了,但毕竟还是有乱序的,所以还是要增加重排序功能。
这个功能对视频也尤其重要。
在代码实现上要设计好,在没有乱序的情况下,不要带来额外的延迟。
大概的算法可以是:
做两个队列,最好是双向循环队列,可以使用链表。
一个是接收队列,用于重排序
一个数发送队列,用于下一级模块获取重排序后的数据
1、先存入接收队列,从队尾开始对比,插在比他序号小的成员后面
2、从接