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

VoIP之前向纠错(FEC)相关推荐

  1. 前向纠错FEC纠错编码原理

    目录 ·简介 ·实现光通信可靠传输 ·性能三要素 前向纠错编码(FEC)技术通过在传输码列中加入冗余纠错码,在一定条件下,通过解码可以自动纠正传输误码,降低接收信号的误码率(BER).在WDM系统中, ...

  2. 流媒体弱网优化之路(FEC)——FEC原理简介

    流媒体弱网优化之路(FEC)--FEC原理简介 文章目录 流媒体弱网优化之路(FEC)--FEC原理简介 一.信道保护措施背景介绍 1.1.ARQ丢包重传 1.2.ABC码率自适应 1.3.FEC前向 ...

  3. 用于通用前向纠错的 RTP 有效载荷格式 (RFC-5109)

    RFC文档链接 本备忘录的状态 本文档为 Internet 社区指定了 Internet 标准跟踪协议,并请求讨论和改进建议. 本协议的标准化状态和现状请参考当前版本的<互联网官方协议标准> ...

  4. Bluetooth Core Architecture Blocks----蓝牙核心架构

    参考: Core System Architecture SIG标准 如今蓝牙由蓝牙技术联盟(Bluetooth Special Interest Group,简称SIG)管理.蓝牙技术联盟在全球拥有 ...

  5. Packet Data Convergence Protocol (PDCP)阅读笔记

    文中涉及多方摘录网络资料,并非完全原创.如涉及侵权,请联系笔者删除. PDCP(Packet Data Convergence Protocol,分组数据汇聚协议) 一.概述: PDCP是对分组数据汇 ...

  6. [4G5G专题-57]:L2 RLC层-详解RLC架构、数据封装、三种模式:透明TM、非确认模式UM、确认模式AM

    目录 第1章  L2 RLC层的架构 1.1 RAN的架构 1.2 L2架构概述 1.3 RLC软件系统结构图 第2章 TCP/IP协议提供的三种传输服务 ​2.1 TCP 2.2 UDP 2.3 R ...

  7. BIGO | imo实时语音传输优化揭秘

    ​2020年新冠疫情持续蔓延全球,亿万人的生活因此发生了巨大的改变,人们对实时音视频通话的日常需求也越来越大.作为BIGO公司旗下重要的全球性即时通讯产品imo为全球2亿多用户提供优质稳定的即时通讯服 ...

  8. 走进音视频的世界——Opus编解码协议

    Opus是一种开源免费的音频编解码器,支持音乐和语音,具有低延时.带内FEC.DTX.PLC等特点,默认22.5ms延时,非常适用网络实时传输.官网:https://www.opus-codec.or ...

  9. 职中计算机网络服务器管理必考题,2017年河北科技师范学院职教研究所、教育学院996计算机知识综合之计算机网络考研导师圈点必考题汇编...

    一.选择题 1. 下列哪种交换的实时性最好?( ) A. 电路交换 B. 报文交换 C. 数据报交换 D. 虚电路交换 [答案]A [解析]计算机通信子网的交换技术主要有两种方式:电路交换和存储转发交 ...

最新文章

  1. DATEIF实例说明4
  2. 【javascript基础】由demo来进阶学习闭包等概念
  3. sort和uniq命令
  4. [css] 你所理解的css高级技巧有哪些?
  5. 【2019牛客暑期多校训练营(第二场) - H】Second Large Rectangle(单调栈,全1子矩阵变形)
  6. java count 在哪一类里_count 是java关键字吗
  7. 洛谷 P1113 杂务
  8. 两个辅助指针变量挖字符串
  9. 宠物医院管理系统(毕设)遇到的问题
  10. 全球首场神经影像人机对决:AI战胜25位医界“最强大脑”!
  11. YAMAHA XJR简易说明[网络]
  12. 2016年腾讯校招笔试题
  13. 基于Nebula3的游戏: 龙歌:黑暗之眼 试玩下载
  14. php ajax 上传进度条,jQuery+php+ajax带进度条无刷新上传文件代码
  15. 英雄联盟手游拳头账号注册
  16. 漏电继电器LLJ-100FG/CT45mm/AC220V
  17. 三国志战略版:萌新手册系列_总结
  18. 产品管理精华:第一,谁是优秀的产品经理?
  19. 关于阿里云服务器的使用(入门级)
  20. 数字图像处理习题(三)

热门文章

  1. nginx请求超时设置
  2. python字典学习感想
  3. H3C配置三层交换机4个步骤详细用法
  4. Proe Creo 二次开发之获得阵列组信息
  5. 如何看计算机几核,电脑几核怎么看?查看电脑属于几核的方法
  6. wp网站更换服务器后打不开,WordPress网站修改IP地址后打不开的解决方法
  7. 骨传导蓝牙耳机怎么用,盘点几款不踩雷的骨传导耳机
  8. MATLAB图形绘制--等高线图
  9. Python实现AI视频识别——手势控制
  10. 从Url路径中中获取某一参数的参数值