版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CrystalShaw/article/details/83413772

一、概述
webrtc冗余打包方式有三种:Red(rfc2198)、Ulpfec(rfc5109)、Flexfec(草案)。其中Red和Ulpfec要成对使用。

二、RedFEC
简单将老报文打包到新包上。如下图所示,冗余度为1时,RFC2198打包情况:

这种方法在音视频领域几乎不使用,因为冗余包只能保护特定一个报文,这种方法带宽占用量很大,恢复能力有限,性价比很低。只是早期的T38传真、RFC2833收号会使用该协议,因为传真和收号的数据量比较小。

webrtc里面说使用了RFC2198冗余,实际上仅仅是借用该协议的封装格式,封装FEC冗余报文。

三、UlpFEC
详细介绍可参考:webrtc QOS方法二.2(ulpfec rfc5109简介)_CrystalShaw的博客-CSDN博客_ulpfec

将一组M个报文进行异或,生成N(N就是FEC的冗余度)个FEC报文,打包出去。这组报文任意丢其中的N个,都可以通过这组(M-N)个报文+FEC冗余包恢复回来,比简单的RFC2198保护的范围扩大了很多。例如下面示意图:D为媒体包,R为冗余包,该图所示的冗余度为2。

1、发送端打包示意图

2、网络丢包示意图

3、丢包恢复示意图

webrtc通过PacketMaskTable表格在选取异或模板。PacketMaskTable表格有连续丢包(kFecMaskBursty、kPacketMaskBurstyTbl)、随机丢包(kFecMaskRandom、kPacketMaskRandomTbl)两种模型。

理论上webrtc可以通过损失程度和乱序情况相关的反馈,自适应选择kFecMaskRandom还是kFecMaskBursty,效果比较好。但是可惜的是,webrtc这块功能缺失,默认使用随机丢包模型。

四、FlexFEC
同UlpFEC实现方式,ULPFEC仅在1D行数组上进行异或,FlexFec更灵活,引进了交织算法,可以在1D行、列、2D数组异或。

1、1D行异或

2、1D列异或

3、2D行列异或

这块还是草案,如何选择异或模式的代码看没深入下去。后续补充。

需要注意,开启FlexFEC需要同时使能 WebRTC-FlexFEC-03/Enabled  && WebRTC-FlexFEC-03-Advertised/Enabled 否则会出现死机异常

五、FEC算法汇总
FEC是无线传输领域的一个前向纠错的算法。网上搜资料的时候经常把无线的算法看的云里雾里的,研究半天都不知道这个和视频传输有什么关系。

无线传输领域的FEC算法主要有TURBO、LDPC、POLAR这三种。

音视频传输领域的FEC算法有如下几种:

1、webrtc的opus音频使用的是inband FEC和交织编码

2、webrtc的视频ulpfec使用的是异或XOR

3、Reed Solomon算法比较复杂,理论上数据恢复能力比较强。

六、webrtc代码分析
1)使能FEC
webrtc默认使能Red+Ulp的FEC。Flex仅在实验阶段,还不能正式使用。

2)封装FEC
发送冗余报文处理
RTPSenderVideo::SendVideo。当编码器支持时间分层,可以仅冗余level 0的视频数据。否则,就要冗余所有视频数据。冗余度是根据丢包率动态调整。

动态调整冗余参数调用栈
BitrateAllocator::OnNetworkChanged
->VideoSendStreamImpl::OnBitrateUpdated
->ProtectionBitrateCalculator::SetTargetRates
->media_optimization::VCMLossProtectionLogic::UpdateMethod
->media_optimization::VCMNackFecMethod::UpdateParameters

最大保护帧数确定
  VCMNackFecMethod::ComputeMaxFramesFec

冗余报文个数确定
ForwardErrorCorrection::NumFecPackets 存储媒体报文数*保护因子。

根据丢包率动态调整冗余度
VCMFecMethod::ProtectionFactor

根据丢包模型原则要冗余的报文
ForwardErrorCorrection::EncodeFec

ForwardErrorCorrection::GenerateFecPayloads

备注:

webrtc在H264编码默认关闭ULPFEC功能,但是可以开启FlexFEC

MaybeCreateFecGenerator

->ShouldDisableRedAndUlpfec

->PayloadTypeSupportsSkippingFecPackets

参考
RED (REDundant coding) - WebRTC Glossary

ULPFEC (Uneven Level Protection Forward Error Correction) - WebRTC Glossary

webrtc fec - 明明是悟空 - 博客园

FEC算法_cloudfly_cn的博客-CSDN博客_fec算法

ulp-fec,flex-fec mask表解读_zhenfei2017的博客-CSDN博客(介绍冗余度和冗余Mask参数)
————————————————
版权声明:本文为CSDN博主「CrystalShaw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CrystalShaw/article/details/83413772

webrtc QOS FEC原理相关推荐

  1. webrtc QOS方法二.1(FEC原理)

    一.概述 webrtc冗余打包方式有三种:Red(rfc2198).Ulpfec(rfc5109).Flexfec(草案).其中Red和Ulpfec要成对使用. 二.RedFEC 简单将老报文打包到新 ...

  2. webrtc QOS方法二.3(FEC冗余度配置)

    一.概述 webrtc的FEC冗余度配置整体思想是: 1.接收端根据收到报文情况计算一个丢包率,通过RTCP_RR报文反馈给发送端. 接收端丢包率计算代码走读请参见:<webrtc代码走读十一( ...

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

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

  4. QOS FEC NACK 实时音视频传输库测试报告(声网、腾讯实时音视频测试)

                        目录 QOS-FEC-NACK传输库简介 实验环境 测试DEMO说明 测试项说明 测试结果 竞品分析 总结                     QOS FE ...

  5. Open vswitch 之Qos rate-limiting 原理

    Openvswitch之Qos rate-limiting原理 OVS的qosrate-limiting功能是采用令牌桶(Token-Bucket)机制进行的.这里的"令牌桶"是指 ...

  6. WebRtC视频jitterbuffer原理机制

    WebRTC视频JitterBuffer详解_一朵喇叭花压海棠的博客-CSDN博客_jitterbuffer本文从代码层面详细描述了WebRTC的视频JitterBuffer模块的主要功能模块,可以作 ...

  7. 【webrtc QOS】视频帧率、分辨率自适应

    [[webrtc]openh264编码:QP 解析] (https://zhangbin.blog.csdn.net/article/details/123382213) 我们了解了werbtc 使用 ...

  8. FEC原理与操作及BigTao机框装机说明

    一.FEC原理与操作​ 1.FEC 原理简介 ​ 前向纠错(英语:forward error correction,缩写FEC)或信道编码(英语:channel coding)是一种在单向通信系统中控 ...

  9. webrtc QOS方法二(FEC)

    一.概述 webrtc冗余打包方式有三种:Red(rfc2198).Ulpfec(rfc5109).Flexfec(草案).其中Red和Ulpfec要成对使用. 二.RedFEC 参考:RED (RE ...

最新文章

  1. 图书借阅系统java_基于JAVAWEB的图书借阅系统
  2. Windows Sockets错误标识及对应解释
  3. VS2013安装oepncv2.4.10 以及opencv 3.0.0
  4. ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试
  5. 阿里云智能语音交互服务导览
  6. 迷宫问题c语言图形化,c语言写的迷宫问题
  7. LaTex使用的一些技巧记录
  8. python生成三对角矩阵_块三对角矩阵python
  9. C++程序设计:字符图形输出(数字三角形)
  10. font-family常用字体集合
  11. 【聚客通scrm】-微信个人号sdk实现的微信云控方案
  12. 程序员被老板要求两个月做个app, 要不比京东差,网友:辞职吧
  13. MyEclipse闪退的解决办法
  14. 什么叫无差别伤害_无差别伤害背后的差别
  15. 云端是一个软件平台,拥有丰富的资源。在云端使用软件,无需安装,一点,下载,直接使用。
  16. 酒店点菜系统c语言,求一个用最基础的C语言编写的简单饭店点菜系统
  17. 现代企业管理-计划和目标
  18. 什么是谐波?谐波的危害
  19. 灵活部署的数据中心Pod已初见端倪
  20. HttpClient 出现 failed to respond 异常解决

热门文章

  1. STM32WB55_NUCLEO开发(9)----接收手机数据点亮LED
  2. 信息学奥赛一本通(只记录有一定义意义的题目,有任何疑问可以私信我)
  3. 深入浅出Zookeeper---3、Leader选举
  4. 金山词霸 2007 龙卷风版 V1.3 简体中文免激活版[已整合SP1升级包] 支持win7
  5. Lesson32_HTMLCSS
  6. STM32基于IIC协议的OLED模块的使用
  7. 华擎z390m-ITX/ac组NAS 安装PVE 7.1+ikuai+黑裙+Windows7(安装备忘录)一
  8. GAN做衣服只需几天,完美生成复古小黑裙
  9. c语言均值滤波步骤,关于中值滤波算法,以及C语言实现
  10. Go语言的CSP模型