VoIP之前向纠错(FEC)

在VoIP领域中,音视频等媒体一般采用RTP/UDP进行封装传输。实际网络(尤其公网)传输中存在拥塞等不稳定情况引发丢包,导致接收端声音变形或视频花屏。为了应对这种情况,一般有以下几种方式:
 1. 实时计算和预测网络带宽,降低视分辨率和编码质量,减少数据量,降低网络拥塞情况
 2. 引入丢包重传技术
 3. 增加冗余包,如FEC(前向纠错)等

 由于实时类应用往往有着比正常数据传输更严格的时延要求,因此,丢包重传通常不是一个合适的解决丢包的方式。更好的方法是通过FEC(Forward Error Correction)机制尝试对丢包进行恢复。FEC机制依赖丢包的情况可以实现全部或部分数据的恢复。该机制完全兼容未部署FEC机制的终端或主机,因此,没有实现FEC功能的接收者通过简单的忽略FEC修复包的方式仍然可以正常工作。常用的FEC纠错码有 parity(奇偶校验位), Reed-Solomon(里德-所罗门码,简称RS), Hamming codes(汉明码)等。

RFC5109(specifies a payload format for generic Forward Error Correction (FEC) for media data encapsulated in RTP)规定了一种在RTP媒体数据中使用前向错误纠正(FEC)机制时的负载格式,其中定义的负载格式允许终端系统使用不同的保护长度和等级实现数据保护,此外,可以使用不同的FEC编码数据组大小来应对不同的媒体和信道情况。 之前的RFC2733和RFC3009已经过期,由RFC5109替代。

FEC机制原理

对M个原始数据包生成N个FEC保护包(也称为修复包或FEC包),一起发送给接收端。在接收端,FEC包和原始媒体包都会被收到,如果没有媒体包丢失,则FEC包会被忽略;如果有媒体包丢失,FEC包结合收到的其它媒体包,可以恢复全部或部分丢失的媒体包。
 
常用术语:
 Media Payload: 媒体负载, 原始数据包,未保护的用户数据,也是放在RTP包中的数据 
 
 Media Header:  媒体头,一般指RTP头部

 Media Packet: 由媒体头和媒体负载组成的包
 
 FEC Packet:  FEC算法对媒体包进行运算新产生的数据包, 这些包中包含冗余的媒体数据,用于错误纠正。
 
 FEC Header: FEC包中的FEC头信息.
 
 FEC Level Header: 每个等级的FEC包中的FEC头信息
 
 FEC Payload: FEC包的负载
 
 Associated: 关联,一个FEC包通常关联一个或多个媒体包

FEC包结构:

 FEC包的FEC头:

 

 E: 扩展保留位,应该设置为0

 L:长掩码标志位,如果设置了,掩码长度是48位,如果没有设置,则是16位
 
 P恢复位、X恢复位、CC恢复位、M恢复位、PT恢复位从被保护的媒体包的RTP头部中获取。
 
 SN base域:设置为被保护的数据组内的最小序列号
 
 TS恢复域:通过被保护媒体包的时间戳计算得出
 
 length recovery field:长度恢复域:用来决定恢复包的长度,原理是通过异或,比如两个媒体包的长度分别为3(011)和5(101),长度恢复域则为011 xor 101 = 110

FEC包的等级头:

FEC等级头是4个或8个8位组(依赖于FEC头的L位),由保护长度域和掩码域组成。保护长度域是16位长度,掩码域是16位长度或48位长度(当L位设置时)
FEC等级头中的掩码域表明哪些包和当前等级的FEC包关联。如果掩码的第i位被设置,则表示序号为(N+1)的媒体包和当前的FEC包关联,其中N指FEC包头中的SN Base 域。最小的掩码位值为0, L位未设置时,最大的掩码位值为15,L位置位时,最大的掩码位值为47.

关键说明: 
1.通常情况下,只是数据包中的媒体重要,而不是整个数据包都同样重要。因此,对数据包的不同部分应用不同等级的保护,这种算法被称为不均匀等级保护( Uneven Level Protection, ULP)

2. 数据的保护能力依赖于数据组的大小,实际上,FEC保护能力是带宽和保护强度的权衡。 

3. 一种方式是FEC包和媒体包使用独立的流发送,这种方案的优势是媒体包能够被不支持FEC机制的接收端解码。

4. 规范中定义了基本的FEC原理,具体实现时不必完全依赖规范中的报文格式,用户可以依据实际情况调整FEC包格式。

5. FEC包类型通过SDP协商选取,一般使用动态类型,如127

6. FEC机制以一组数据为单位进行运算,组与组之间相互独立的,每个组的大小/包数可以不同

7. 实际应用中,信道条件较差,接收方丢包率上升,发送端可以调高冗余度,以增强抗丢包能力;反之,如果接收方丢包率很低, 发送端则可以降低冗余度,以节省网络带宽

8. FEC的代价之一,就是引入延时

9.RFC5109中是将RTP负载和RTP头分开做处理的,一种简单的做法可以对整个RTP包做FEC运算

10.FEC机制的恢复能力是有限的,如果丢包太多,无法修复。抗丢包的最大恢复能力取决于FEC编码组的数据包个数和FEC包个数以及恢复算法的能力

 实际案例:

对整个RTP包做FEC运算,每10个RTP原始数据包生成2个FEC恢复数据包,FEC包内为私有协议,以动态类型127作为负载类型,随原始RTP包一起发送。

 

 注:缺失的33254包可以在接收端恢复

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪游东戴河

你就是这个世界的唯一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值