一、概述

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

二、RedFEC

参考:RED (REDundant coding) - WebRTC Glossary

RFC 2198 - RTP Payload for Redundant Audio Data

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

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

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

三、UlpFEC

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

RFC 5109 - RTP Payload Format for Generic Forward Error Correction

详细参考:

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

1)发送端打包示意图

2)网络丢包示意图

3)丢包恢复示意图

若UlpFEC异或所有报文,带宽占用量也比较大,在实际应用会根据网络情况进行适当取舍。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

  • 最大保护帧数确定​​​​​​​

  • 冗余报文个数确定

ForwardErrorCorrection::NumFecPackets 存储媒体报文数*保护因子。

  • 根据丢包率动态调整冗余度

  • 根据丢包模型原则要冗余的报文

参考:

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

FEC算法_Cloudy_cn的专栏-CSDN博客_fec算法

ulp-fec,flex-fec mask表解读_zhenfei2017的博客-CSDN博客

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. 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. QoS服务质量二令牌桶算法及QoS业务分类

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

  7. Android WebRTC 入门教程(二) -- 模拟p2p本地视频传输

    Android WebRTC 入门教程(一) – 使用相机 Android WebRTC 入门教程(二) – 模拟p2p本地视频传输 源码工程: https://github.com/LillteZh ...

  8. WebRTC系列<二> 案例与工具

     阅读关于webRTC的其他文章: WebRTC系列<一> 什么是WebRTC? WebRTC系列<二> 案例与工具 ----------------------------- ...

  9. 链表问题15——将搜索二叉树转换成双向链表(方法二)

    题目 题目同上一篇文章,即题目将二叉树按照中序顺序转换成双向链表 思路 方法二:利用递归函数,不使用任何容器.时间复杂度为O(N),额外空间复杂度为O(h),h为二d d d df叉树的高度 首先需要 ...

最新文章

  1. python自动化ppt_python自动化怎么操作ppt?
  2. scp 将数据从一台linux服务器复制到另一台linux服务器
  3. 开源流媒体项目 live555 简介
  4. 从Java 9 到 Java 17之Java 12
  5. opencv打开摄像头采集和保存
  6. sql 汉字转首字母拼音
  7. 比较两个时间字符串的大小
  8. hdu1873 看病要排队-优先队列
  9. rdkafka线程过多_Kafka快速入门(十一)——RdKafka源码分析
  10. Python的PyDBG调试器的用法
  11. dataframe数据按行做线性拟合
  12. SAAS--01HRM系统概述与搭建环境
  13. GNSS/INS组合导航(九):三维简化的INS/GPS组合导航系统
  14. BSS/SSID/BSSID、VAP和ESS
  15. WPS自动生成目录,目录里显示图片如何解决
  16. 计算机相关常数,地址常数
  17. 【相机标定系列】相机sensor传感器尺寸,CMOS靶面尺寸,分辨​率​和​镜头​焦距,畸变处理效果,相机主点
  18. Android开发笔记(一百零八)智能语音
  19. Cesium计算坡度坡向分析
  20. wkhtmltopdf 字体无效问题

热门文章

  1. 拉格朗日插值法+python实现
  2. 网口压线顺序_手把手教学网线做法 掌握这几个步骤 轻松搞定
  3. 复数四则运算(PTA)
  4. 3.补偿导线的原理及应用
  5. 全面的学习 游戏外挂 编程开发 视频教程+源代码
  6. Garuda Linux配置
  7. python标签整理 微信_Python实现清理微信僵尸粉功能示例【基于itchat模块】
  8. Makefile脚本学习
  9. 项目、系统开发中的需求分析说明书和需求规格说明书的区别
  10. 2022-08-02 第二小组 张明旭 Java基础学习记录