一、概述

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参数)

webrtc QOS方法二.1(FEC原理)相关推荐

  1. webrtc QOS方法二(FEC)

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

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

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

  3. webrtc QOS方法十二(接收端IDR帧请求)

    1.解码前长时间要不到帧,IDR帧请求 webrtc的接收端根据时间控制I帧请求是在解码前要包里面实现的.在指定时间内没有要到包,就发送I帧请求. VideoReceiveStream2::Start ...

  4. webrtc QOS方法四.2(拥塞算法学习)

    一.网图简介 现在我们接入网络的方式有三种:手机4G/5G.WIFI.网线.三种接入方式在网络中的位置如上图所示.引起网络质量差的原因也有很多,比方说4G/5G.WIFI信号弱.wifi信道竞争.云营 ...

  5. webrtc QOS FEC原理

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

  6. 思科SPCCIE必考QOS流量整形traffic shaping原理及配置方法-ielab网络实验室

    思科SPCCIE必考QOS流量整形traffic shaping原理及配置方法-ielab网络实验室 流量整形(traffic shaping)典型作用是限制流出某一网络的某一连接的流量与突发,使这类 ...

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

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

  8. webrtc QoS -服务质量总结

    什么是QOS QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技 ...

  9. QoS服务质量二令牌桶算法及QoS业务分类

    QoS服务质量二令牌桶算法及QoS业务分类 2.3.3.DiffServ模型令牌桶算法 2.3.4.基于DiffServ模型的QoS组成 2.3.3.DiffServ模型令牌桶算法 令牌桶算法是网络流 ...

最新文章

  1. opencvmediapipe 人脸检测+摄像头实时
  2. 用Spotlight on windows 实时监控Windows服务器性能
  3. python怎么执行程序_小鹅通视频怎么下载?用python实现小鹅通视频下载(二)
  4. numpy 中的nan和常用的统计方法
  5. keystone系列二:HTTP协议
  6. java怎么递归_什么是递归?用Java写一个简单的递归程序
  7. SQLserver 2005 安装文档
  8. select2使用问题--删除添加select2的DOM
  9. webstorm 下载并设置jade、less
  10. 2018 年 8 月面试路:6 天 21 家公司
  11. ECharts 饼图的合并显示
  12. 程序猿头头(object与数组的简单应用)
  13. Peekaboo—站立式会议+alpha冲刺:Day2冲刺随笔
  14. greenplum查询表结构java_Greenplum小把戏 - 几个常用数据库对象大小查询SQL
  15. oracle存储过程报错:ORA-06550: wrong number or types of arguments in call to
  16. win7下怎么配置ODBC数据源
  17. layui表格全英文,跳页部分
  18. 远控木马上演白利用偷天神技:揭秘假破解工具背后的盗刷暗流
  19. 想要软件外包,企业开发APP和小程序如何才能不吃亏?
  20. 使用pyspark 的udf进行tensorflow 模型的预测报错 _pickle.PicklingError: Could not serialize object:

热门文章

  1. 华为OD机试 - 最多等和不相交连续子序列(Java JS Python)
  2. Leveldb源码分析--1
  3. EOS数据分析——让RAM再飞一会儿
  4. 2020年T电梯修理考试总结及T电梯修理试题及答案
  5. 光滑曲线_微分几何笔记(2) —— 曲线的参数化
  6. 色彩理论之RGB(1)
  7. 权限系统中的数据权限就该这么设计,yyds!
  8. 产品外观设计一一素描
  9. [C++]Leetcode279.完全平方数
  10. 二张图看懂SaaS、PaaS 和 IaaS 的区别