需要解决的问题

1、FEC Level Header for FEC Packets中的Protection Length 字段的大小是如何确定的?RFC5109中10.2节的例子中没有明确给出该字段值的计算方式。
2、RFC5109中10.3节的东西,还需要仔细阅读,因为WebRTC中,就是采用该方式传输的数据包。
3、ULP FEC的具体实现,需要阅读WebRTC源码

FEC总结比较好的文章

1、FEC 5109协议的翻译

https://blog.csdn.net/viyana/article/details/119083236#_1

2、FEC 5109的关键知识总结

https://www.pianshen.com/article/94831094807/

3、ULP FEC 在WeBRTC中的实现

深度分析WebRTC源码,源码更新时间为2019年7月25日,本节总结了ULPFEC在WebRTC中的实现,以及应用;下面以Video为例,从FEC掩码构建,FEC报文构建两个方面分析ULPFEC在WebRTC中的实现。

3.1 ULPFEC报文构建流程


在捕获到数据后,通过RTPSenderVideo::SendVideo发送数据。如果当前会话配置了red和ulpfec,则调用RTPSenderVideo::SendVideoPacketAsRedMaybeWithUlpfec,该函数主要完成五件事:
1)调用BuildRedPayload函数,将发送的数据生成RED包;
2)UlpfecGenerator::AddRtpPacketAndGenerateFec,使用媒体数据生成FEC包;
3)UlpfecGenerator::GetUlpfecPacketsAsRed,获取生成的FEC包;
4)LogAndSendToNetwork(red_packet),发送RED媒体数据包
5)LogAndSendToNetwork(std::move(rtp_packet)),发送FEC包

步骤2)中,会调用ForwardErrorCorrection::EncodeFec,其中该函数,主要完成了五件事:
a)ForwardErrorCorrection::NumFecPackets,通过保护因子计算FEC包个数
b)internal::GeneratePacketMasks,生成掩码,packet_masks_。
c)ForwardErrorCorrection::InsertZerosInPacketMasks,如果发生了丢包,调整packet_masks_
d)ForwardErrorCorrection::GenerateFecPayloads,生成FEC数据包
e)ForwardErrorCorrection::FinalizeFecHeaders,修正FEC头部

至此,FEC包的构造过程分析完毕。需要注意的是,虽然WebRTC中实现ULPFEC,但是使用的任然是均等保护,没用使用ULPFEC;另外,在WebRTC内部,保护RTP头部的FEC头部称之为Level 0,而保护RTP负载的的FEC Level部分称之为Level 1,这里和RFC5109中的定义略有不同,需要注意。

3.2 ULPFEC掩码表和掩码

FEC Level Header里面的mask

根据RFC5109定义,一个媒体数据包可以被多个FEC包保护,一个FEC包可以多保护多个媒体数据包。

假设m个媒体数据包需要n个FEC数据包保护,则可以定义一个如下图所示的二维的m * n零一矩阵来描述媒体数据包在fec包中的保护分布情况:

1)矩阵中元素m[i, j]置1表示第j个媒体数据包需要第i个FEC包保护。

2)从行角度来看,第i行元素表示第i个FEC包保护的媒体数据包的集合;

3)从列角度讲,第j列元素表示保护第j个媒体数据包的FEC包的集合。

由于该矩阵是零一矩阵,因此在存储上可以采用掩码来存储。这个掩码也就是FEC Level Header中所定义的mask掩码。

那么掩码中的0、1如何分布?现实世界中网络丢包分为随机丢包、突发丢包两种情况,FEC包需要能够针对这两种情况对媒体数据包进行保护。WebRTC预先构造两个掩码表kPacketMaskRandomTbl和kPacketMaskBurstyTbl,以模拟在随机情况和突发情况下媒体数据包在FEC包中的保护分配情况。

假设在随机丢包场景下,对于m * n的情况,我们只需要从kPacketMaskRandomTbl[m][n]就可以获取FEC包所需要的全部掩码,然后该掩码为基础,构造FEC数据包。注意这里的m指的是要保护的媒体包的个数,n指的是FEC包的个数。(可能是外国人的习惯问题,喜欢列在前,行在后面)

在这里需要注意:1、当保护的媒体包个数小于等于12时,使用WebRTC中定义的两个掩码表来获取掩码,如果保护的媒体包大于12时,需要通过代码计算掩码;

3.3 ULPFEC的实现

里面还保留了一套UnequalProtectionMask接口,这套接口里面有三种掩码模式:NoOverlap、Overlap、BiasFirstPacket

非对称保护思想是,FEC包对媒体数据包集合中的不同数据包实施不同的保护力度。某些场景下,一帧视频数据编码后生成的一系列RTP数据包,重要性不一样,比如开始几个RTP包包含PPS、SPS等信息,重要性会大一些。因此,在构造FEC包的掩码时,有均匀保护和非均匀保护两种策略。

均匀保护:所有RTP包重要性一样,FEC包对他们进行平等均匀保护。对于m * n,FEC包使用掩码MaskRandomTbl[m][n]。

非均匀保护:RTP包集合分重要数据包集合S1、普通数据包集合S2,分配较多个FEC包保护S1,较少个FEC包保护S2。WebRTC定义三种模式针对实现非均匀保护:

1)kModeNoOverlap:非叠加保护,保护S1的掩码和S2的掩码相互分离。
2)kModeOverlap:叠加保护,保护S1的掩码和S2的掩码叠加在一起。
3)kModeBiasFirstPacket:在均匀保护的基础上,所有FEC包都保护第一个包。

假设保护场景为(m, n),其中重要数据包为前k个,分配给重要数据包的FEC包个数为t,掩码表为mask_table。则三种场景下最终掩码的确定如下:

1)kModeNoOverlap:mask_table[k][t]和mask_table[m-k][n-t]的移位组合。
2)kModeOverlap: mask_table[k][t]和mask_table[m][n-t]的拼接。
3)kModeBiasFirstPacket:mask_table[m][n],再第一列全部置1。

不过目前webrtc的编码器使用单Slice编码,视频RTP报文重要程度无大差别,所以就没有使用这个功能。
————————————————
版权声明:本文为CSDN博主「CrystalShaw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CrystalShaw/article/details/102950002

参考

webrtc QOS方法二.2(ulpfec rfc5109简介)
《ULPFEC在WebRTC中的实现》

WebRTC-FEC协议总结相关推荐

  1. webrtc fec

    转自:http://www.cnblogs.com/webrtc/p/7402570.html WebRTC::FEC [TOC] Tags: WebRTC FEC WebRTC中的 FEC 实现分为 ...

  2. WebRTC::FEC

    WebRTC::FEC 目录 WebRTC::FEC ULPFEC FLEXFEC Encode ulpfec Decode ulpfec 动态 FEC 冗余度 FlexFEC in WebRTC W ...

  3. 【WebRTC---入门篇】(十二)WebRTC传输协议

    浏览器协议栈(左图传统HTTP 右图WebRTC) RTP/SRTP RTP是未加密的数据,SRTP是加密后的数据. RTP协议

  4. WEBRTC RFC5766-TURN协议

    摘要 如果一台主机处于NAT后面,那么在一定条件下两台主机无法之间进行通讯.在这种条件下,那么使用中继服务提供通讯是有必要的. 这个规范定义了一个名为TURN(使用中继穿越NAT)的协议,它允许一台主 ...

  5. webrtc 和 rtp 协议

    我会开辟一个空间rtp协议,包含vp9 h264 h265 aac opus 等rtp实例,包含实例代码,让看文章的人得到真实的提升 一.webrtc rtp协议为实时传输协议 real transf ...

  6. webrtc中的ulp fec实现分析

    目录 概述 1.rfc5109关于ulpfec的定义 1.1 fec包结构 1.2 fec header结构 1.3 ulp header 结构 2.webrtc中ulpfec的启用 3.掩码表的作用 ...

  7. webrtc QOS方法二(FEC)

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

  8. webrtc QOS FEC原理

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

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

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

  10. H5视频会议,直播,通话,教学,支持Webrtc、rtmp、sip、rtsp转协议、IPCAM、白板、桌面共享、免插件、web全平台、视频融合系统研发笔记。...

    随着互联网深入,视频互通互联的需求越来越多,近些年国家要进一步发展5G网络,手机等设备硬件也越来越好,对视频互通性,及时性,便捷性提出了新的需求. 1,H5-WEB接入,全平台web通用: a.在针对 ...

最新文章

  1. vue 3.0和2.0区别_一文看懂 Vue.js 3.0 的优化
  2. oracle技术之顺序文件上的索引(一)
  3. wordpress汉化技巧_保护您的WordPress网站的6个技巧
  4. java的如何创建js_[Java教程]JS创建事件的三种方式(实例)
  5. 怎样计算一个整数的位数并把每一位上的数字保存下来
  6. P1375 嵌套矩形
  7. angular中使用z-tree初始化之后,展开根节点不生效
  8. css3中的文字效果
  9. matlab pv图,Matlab中imagesc
  10. 拼多多优惠券bug造成千万损失引发的优惠券安全思考
  11. C++17之std::any
  12. 水果店圈子:水果店开业宣传文字怎么发,水果店准备开业怎么发朋友圈
  13. 怎么将两个pdf文件合并在一起
  14. delphi(XE2)实现图片异形窗体,支持摆放控件
  15. mk突变点检测_MK检验突变分析 matlab
  16. hbw-utils - UUIDUtils
  17. 使用java代码获取yml及properties文件中的内容,获取值
  18. Bartender打印
  19. 【嵌入式Linux应用开发】SquareLine Studio与LVGL模拟器
  20. 【Python深度学习】基于Tensorflow2.0构建CNN模型尝试分类音乐类型(二)

热门文章

  1. m序列信号发生器--基于线性移位反馈寄存器LFSR
  2. DNA偶联PbSe量子点|近红外硒化铅PbSe量子点修饰脱氧核糖核酸DNA|PbSe-DNA QDs
  3. Ubuntu16.04利用expect模拟键盘输入实现自动化交互
  4. 2019阿里校招数据研发/算法工程师 hr面
  5. react 使用 svg_使用SVG和React.js构建日历热图
  6. 数说故事与中山大学人机物智能融合实验室正式达成战略合作
  7. Struts2中的FilterDispatcher
  8. android camera 拍照流程,Android -- Camera源码简析,启动流程
  9. FPGA概念、芯片结构、工作原理、开发流程以及xilinx公司主要可编程芯片
  10. python程序设计课后答案第三单元_智慧职教APPPython程序设计课后答案