一、现象
通话中语音断断续续,视频卡顿或丢失画面,造成这些现象的一个重要原因是数据包在传输过程中出现丢失,在后端处理中,可以通过一些算法对缺失的数据进行预估,减轻一些影响,例如视频可以用I帧、P帧预估一些丢失的P帧,语音可以添加舒适噪音数据,但效果较好的办法还是降低丢包率。
二、原因
丢包的原因是媒体数据传输为了保证实时性,使用了UDP作为传输层的RTP协议,UDP只提供尽量送达的服务,数据传输过程经过网络中众多的交换机、路由器等设备有很多情况会导致数据包丢失。
三、处理办法
1、NACK
丢包首选想到的解决办法就是让发送端重发,那就需要接收端告诉发送端丢了那些包。NACK也就是no ack,接收端发送NACK给发送端,告诉丢了那些包,发送端重发。voice使用NackTracker类存丢包的sequence_number信息,而vodie使用NackModule类。
voice的NACK算法:
当收到一个包时,与上次收到的包比较序列号IsNewerSequenceNumber,如果序列号大,那上次收到包到本次收到的包之间缺失的包,可以看做包延时或丢失,定义一个常量nack_threshold_packets_,规定本次收到包之前的临近的nack_threshold_packets_个包是延时,其余的包认为丢失,并更新NackList,对丢失的包SendNACK给发送端。
vodie的NACK算法:
与voice的原理差不多,视频的数据量大,I帧最重要的特点,算法需要尽量重传关键数据,定义常量kMaxPacketAge,规定本次收到包的临近的kMaxPacketAge个包有机会重传,