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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Docker Compose详解

    Docker Compose详解使用 DockerCompos 预计阅读时间 11 分钟 DockerCompos 是一种用于帮助定义和共享多容器应用程序的工具 使用 Compose 我们可以创建一个 YAML 文件来定义服务 并且使用一个命令 可以启动所有内容或将其全部关闭 使用 Compose 的最大优势是您可以在一个文件中定义您的应用程序堆栈 将其保存在项目 repo 的根目录中 它现在是版本控制的 并且可以轻松地让其他人为您的项目做出贡献 有人只需要克隆您的存储库并启动撰写应用程序 事实上 你现在可能会在 GitHub Gi

    2025年6月17日
    2
  • Synth_Runner命令:合成控制法高效实现

    Synth_Runner命令:合成控制法高效实现原文链接:https://www.lianxh.cn/news/db3d2785cd5c0.html目录1.背景介绍 2.合成控制法原理 3.合成控制高效实现:`synth_runner` 3.1命令安装 3.2语法格式 3.3加州控烟案例 4.参考资料连享会合成控制法专题推文合成控制法(SyntheticControlMethod)及Stata实现 Stata:合成控制法程序 Stata:合成控制法synth命令无法加载pl…

    2022年5月1日
    66
  • OkGo详解

    OkGo详解一 什么是 OkGoOkGo 基于 okhhttp 的封装类 你会发现他真的比 okhttp 简单的多 一个专注于让网络请求更简单的框架 与 RxJava 完美结合 比 Retrofit 更简单易用 二 主要功能 1 基本的 get post put delete head options trace patch 八种请求 2 支持 upString upJson upBytes upFile 等 up 类方法上传特定数据 3 支持一个 key 上传一个文件 也可以一个 key 上传多个文件 也

    2025年8月4日
    1
  • ajax怎么解决报414,关于c#:HTTP错误414。请求URL太长。 asp.net

    ajax怎么解决报414,关于c#:HTTP错误414。请求URL太长。 asp.net我收到错误”HTTP错误414。请求URL太长”。从下面的文章中,我了解到这是由于查询字符串很长所致:在web.config中,我有maxQueryStringLength=”2097151″。这是最大值吗?为了解决此问题,我应该在web.config中设置maxUrl吗?如果是这样,支持的最大值是多少?我该怎么办才能解决此错误?是否可以将URL中的某些长字符串替换为整数或Guid?如果…

    2022年6月3日
    43
  • python——初识python(安装pycharm和ipython)

    python——初识python(安装pycharm和ipython)Python之编译安装三部曲编译安装三部曲:configure   编译make    安装makeinstall  安装成包解压压缩包tarzxfPython-3.6.4.tgz-C/opt/安装编译过程需要的依赖性(进入到安装包路径下)cd/opt/cdPython-3.6.4/yuminstallgcc-y安装yum…

    2022年8月26日
    3
  • Java的异常处理机制

    Java的异常处理机制一、什么是java异常?java异常指在程序运行时可能出现的一些错误,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流。Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。当条件生成时,错误将引发异常。Java异常类…

    2022年5月19日
    40

发表回复

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

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