webrtc技术原理_webrtc开源项目

webrtc技术原理_webrtc开源项目一、概述webrtc冗余打包方式有三种:Red(rfc2198)、Ulpfec(rfc5109)、Flexfec(草案)。其中Red和Ulpfec要成对使用。二、RedFEC简单将老报文打包到新包上。如下图所示,冗余度为1时,RFC2198打包情况:这种方法在音视频领域几乎不使用,因为冗余包只能保护特定一个报文,这种方法带宽占用量很大,恢复能力有限,性价比很低。只是早期的T38……

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、概述

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

二、RedFEC

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

webrtc技术原理_webrtc开源项目

这种方法在音视频领域几乎不使用,因为冗余包只能保护特定一个报文,这种方法带宽占用量很大,恢复能力有限,性价比很低。只是早期的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、发送端打包示意图

webrtc技术原理_webrtc开源项目

2、网络丢包示意图

webrtc技术原理_webrtc开源项目

3、丢包恢复示意图

webrtc技术原理_webrtc开源项目

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

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

四、FlexFEC

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

1、1D行异或

webrtc技术原理_webrtc开源项目

2、1D列异或

webrtc技术原理_webrtc开源项目

3、2D行列异或

webrtc技术原理_webrtc开源项目

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

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

五、FEC算法汇总

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

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

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

webrtc技术原理_webrtc开源项目

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

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

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

六、webrtc代码分析

1)使能FEC

webrtc默认使能Red+Ulp的FEC。Flex仅在实验阶段,还不能正式使用。

webrtc技术原理_webrtc开源项目

2)封装FEC

  • 发送冗余报文处理

RTPSenderVideo::SendVideo。当编码器支持时间分层,可以仅冗余level 0的视频数据。否则,就要冗余所有视频数据。冗余度是根据丢包率动态调整。

webrtc技术原理_webrtc开源项目

  • 动态调整冗余参数调用栈

BitrateAllocator::OnNetworkChanged
->VideoSendStreamImpl::OnBitrateUpdated
->ProtectionBitrateCalculator::SetTargetRates
->media_optimization::VCMLossProtectionLogic::UpdateMethod
->media_optimization::VCMNackFecMethod::UpdateParameters    

  • 最大保护帧数确定

  VCMNackFecMethod::ComputeMaxFramesFec

webrtc技术原理_webrtc开源项目

  • 冗余报文个数确定

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

webrtc技术原理_webrtc开源项目

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

VCMFecMethod::ProtectionFactor

webrtc技术原理_webrtc开源项目

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

ForwardErrorCorrection::EncodeFec

webrtc技术原理_webrtc开源项目

ForwardErrorCorrection::GenerateFecPayloads

webrtc技术原理_webrtc开源项目

备注:

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

MaybeCreateFecGenerator

->ShouldDisableRedAndUlpfec

->PayloadTypeSupportsSkippingFecPackets 

webrtc技术原理_webrtc开源项目

参考

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169598.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • eclipse配置android_零基础电脑初学者入门教程

    eclipse配置android_零基础电脑初学者入门教程Eclipse Android开发入门手册 资源下载http://tools.android-studio.orgjdk,AndroidSDK,开发工具eclipse、Androidstudio、idea  配置java环境搜索jdk安装对应的包,参照http://www.runoob.com/java/java-environment-setup.html  配置环境 安装eclipse和A…

    2022年10月4日
    3
  • endnote参考文献改为文字(参考文献endnote格式)

    最简单的,自动下载style:打开endnote—-edit—-outputstyles—-openstylemaneger—-在新打开的界面中点击中部的getmoreontheweb,此时自动连接endnote官网,在网页中部的搜索窗口输入目标杂志名称,点击search,然后在弹出的resultsfound下方点击搜索结果后方的download,下载文件,之…

    2022年4月16日
    255
  • 手把手撸个博客网站

    手把手撸个博客网站node-webserver-blog-public源码地址博客地址CSDN运行项目前必读三个项目中各种各样的授权参数已全部修改成自己的授权参数,忘悉知!!!!忘悉知!!!!忘悉知!!!!自己创建一个数据库名称就可以了,表是运行node时候自动创建好以myblog3为数据库名称,admin登录页面有个一键生成地方生成账号:admin密码:123,只能生成一次,因…

    2022年7月14日
    12
  • unittest测试框架原理_学软件测试4个月没找到工作

    unittest测试框架原理_学软件测试4个月没找到工作unittest框架解析unittest是python的单元测试框架,unittest单元测试提供了创建测试用例,测试套件以及批量执行的方案,unittest在安装pyhton以后就直接自带了,直接importunittest就可以使用。作为单元测试的框架,unittest也是可以对程序最小模块的一种敏捷化的测试。在自动化测试中,必须需要知道所使用语言的单元测试框架。利用单元测试框架,创建一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元,

    2022年10月15日
    3
  • Pycharm中调用kinect_python中的pandas库

    Pycharm中调用kinect_python中的pandas库pycharm中调用pandas1.因为学习了pandas的知识点,所以就找些实例去练手。结果在pycharm中输入importpandsaspd时,pandas单词这里会被标注红色,然后根据提示,我就去settings…中去进行设置,settings->project->projectinterpreter可以看到package中没有pandas包。点击右上角的加…

    2022年8月29日
    6
  • navigator对象_navigator.geolocation

    navigator对象_navigator.geolocationNavigator对象包含有关浏览器的信息,是BOM对象。一、Navigator对象属性属性 说明 appCodeName 返回浏览器的代码名 appName 返回浏览器的名称 appVersion 返回浏览器的平台和版本信息 cookieEnabled 返回指明浏览器中是否启用cookie的布尔值 platform 返回运行…

    2025年10月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号