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

一、概述

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配置与最佳实践 在WebRTC应用中,确保高质量的服务(QoS)对于提供流畅的实时通信至关重要。为了达到这一目标,网络条件评估和适应机制扮演着重要角色[^1]。 #### 自动调整带宽估计 WebRTC内置了一个复杂的算法来自动估算可用带宽并相应地调整视频编码参数。这种自适应比特率(ABR)技术能够动态响应变化的网络状况,在保持低延迟的同时最大化视觉质量。 #### 使用SVC分层编码 可扩展视频编码(SVC)允许发送端创建多个不同分辨率版本的数据流,接收方可以根据当前网络状态选择最合适的层次解码播放。这种方法提高了鲁棒性和灵活性,尤其适合于具有高度波动性的无线连接环境。 #### 实施FEC前向纠错策略 通过启用前向错误校正(FEC),可以在一定程度上补偿数据包丢失带来的影响而不必重传整个帧。这有助于减少卡顿现象的发生频率,特别是在丢包较为严重的场景下表现良好。 ```javascript // JavaScript示例:开启FEC功能 const pc = new RTCPeerConnection(); pc.addTransceiver('audio', {direction:'sendrecv'}); let sender = pc.getSenders()[0]; sender.setParameters({ encodings: [{ fec: true, }] }); ``` #### 配置优先级队列 在网络设备层面设置基于DSCP标记或其他标准的流量分类规则,可以为多媒体会话分配更高的转发优先级,从而保障其传输效率不受其他类型业务干扰。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值