对于UDP丢包,我们采用改进型的vandermonde矩阵FEC (Forward Error /Erasure Correction)前向纠错技术来进行丢包恢复,由发送方进行FEC编码引入冗余包,接收方进行FEC解码并恢复丢失的数据包。对于包乱序和包重复,我们采用QOS乱序恢复处理,该QOS方案特点是在没有丢包的情况下,不引入任何系统延时,并且可以通过可控的丢包等待时延来适应不同的信道乱序程度。QOS需要在接收端进行FEC解码前进行,确保送FEC解码模块的数据包序号是正确的(不存在乱序,仅存在丢包)。众多产品案例表明:采用FEC+QOS+RTP的组合,能显著提升UDP传输的丢包、乱序抵抗力,为上层音视频服务提供有力保障。下图1是各模块在系统中的位置说明。
需要说明如下几点:
(1)从差错控制角度看,传输信道可以分为随机信道、突发信道和混合信道。在随机信道中,丢包出现是随机的,且相互统计独立,满足正态分布。在突发信道中,丢包是集中出现的,在一些短促的时间区间会出现大量的丢包,而在这些时间区间之外又存在较长的无丢包区间。混合信道则是上述二者的合体。本方案侧重于对具备随机信道特性的传输链路进行改进优化。互联网丢包、乱序现象的出现很难预知,人们对 Internet信道的丢包特性研究发现,大多数情况下其满足随机信道的特点,丢失的都是单个包。连续两个或以上包同时丢失的概率虽然比纯随机过程要高,但发生的概率还是要比单包丢失低,发生连续丢失10个以上包的概率就更低了。由于单包丢失出现的最频繁,我们的抗丢包方案主要侧重于对单包丢失的修复,同时也应该兼顾连续丢失的少量包的修复。对大量连续丢失的包的修复相对来说就显得不那么重要了(出现概率低,修复的代价大)。
(2)当然,任何差错控制方案都是有其最大纠错能力限制,当丢包率超出当前系统的纠错能力时,丢包无法恢复,对于视频应用来说意味着视频将出现花屏。为了改善系统在高丢包率下的用户体验,避免长时间花屏无法刷新的现象,我们建议使用者采用ARQ(自动请求重发)+FEC机制,这里的ARQ请求并不是请求远端重发丢失的数据包,因为那样相当于走了TCP这类内嵌ARQ功能协议的老路,必然引入不可控的延时。这里的ARQ只是请求远端即刻编码视频关键帧,避免长时间花屏无法刷新的现象,ARQ请求一般通过额外的TCP信道发出(在绝大多数的系统中,通讯双方一般会有TCP的信令通道,用于双方业务层信令的交互)。ARQ的发起是根据FEC解码输出视频码流是否丢包作为判断依据,发送端和接收端都需要对ARQ的频率做一定的保护措施,避免频繁的发起和响应,造成过多的I帧(过多I帧的副作用前面已有列举)。