• 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包可以在接收端恢复

  • 相关阅读:
    【halcon】halcon字符识别——OCR
    Dijkstra算法浅理解
    131. 分割回文串-思路整理
    顺序表详解——遍历、增添、查找、删除、修改、清除
    阿里云服务器安装MySQL、Apache、PHP
    2024最全最有用网络安全工程师面试题(附答案),金三银四找工作必看!
    Levels - UE5中的建模相关
    Linux进阶-线程
    【微服务架构】基础的微服务架构模板、fianceCampus项目
    定时执行专家 —— 使用网络唤醒功能实现远程开机
  • 原文地址:https://blog.csdn.net/szkbsgy/article/details/125528005