webrtc QOS方法五.1(帧率调整)

WebRTC Qos优化杂记 本文是笔者对WebRTC Qos性能研究、优化的一些思考,希望对有兴趣的读者有一些启发。 阅读详情

一、框架图

 

二、帧率调控算法

根据上图所示,发送端有三个模块会对帧率进行调整:

1、当视频采集帧率大于编码器输出帧率,会直接掉帧。在VideoStreamEncoder::EncodeTask类中的Run函数里实现。

2、编码器输出码率是否超过目标码率,超过时会在编码前进行掉帧。在MediaOptimization->DropFrame漏桶算法里实现。

3、webrtc的VPX、openh264编码器,码控模块有接口配置是否掉帧调节码率功能。参见VideoCodecVPX/VideoCodecH264的frameDroppingOn定义。

详细实现流程,请参考《webrtc QOS方法五.2(发送端帧率调整原理及实现流程)》

三、webrtc的帧率

如上框架图,webrtc的帧率从左到右,帧率是持递减状态的。摄像头的采集帧率是发送端帧率的极限值。

1、摄像头采集帧率

视频采集卡帧率能力集,可以通过potplay工具查看。打开->设备设置->摄像头

摄像头能采集的帧率与摄像头的型号、视频分辨率有关。他能提供的帧率,决定发送端视频帧率的最大值。

但是摄像头实际采集帧率,可能受实际环境光强影响,具体请参见:《webrtc QOS方法七(摄像头采集帧率调整)》

2、编码器输入帧率

理论上编码器的输入帧率小于等于视频采集的帧率。编码器编码的性能+视频采集帧率决定编码器的输入帧率。

若摄像头的640*480的采集帧率是30fps,若编码器的640*480的编码性能是60fps,那么编码器的输入帧率为640*480 30fps。

若编码器性能比较差,640*480的编码性能是25fps,那么编码器的输入帧率为640*480 25fps。

当采集帧率大于编码帧率,会在VideoStreamEncoder::EncodeTask::Run函数进行掉帧处理。没有使用平滑算法,仅仅判断当前编码器是否空闲,空闲可以正常编码,不会丢帧,否则就会丢弃当前帧。

3、编码器输出帧率

输入到编码器的视频帧,不一定全部被编码。如前面Send Side BWE介绍,当网络出现延时或者丢包的情况下,码率会持续下调。但是帧率不变的情况下,码率持续下调必然会导致视频质量快速下降。MediaOptimization大概思路就是在编码前通过降帧率的方法,降低码率。这样单帧的视频质量不会下降的特别明显。

详细实现参见:VideoSender->VideoSender::AddVideoFrame->_mediaOpt.DropFrame()

另外VP8、VP9、openH264都有一个EnableFrameSkip选项,开启该功能后,当视频编码输出的码率无法压缩到指定的目标码率,编码器的码控模块,也会通过掉帧的方式调节。导致实际输出编码器的帧数小于等于输入编码器的帧数。

4、网络接收帧率

同一帧视频的不同RTP的报文时间戳是相同的,一帧视频结束的最后一包的RTP报文头的MARK位为1。所以在网络测,判断一帧视频是否接收完全,同一个时间戳的报文的序列号是否连续,改时间戳的RTP报文是否收到MARK为1的包。

由于网络丢包延时等影响,网络接收到的数据帧若不完全,是不需要传递给解码器的,否则解码器也会解出花屏的数据。或者网络接收模块没有判断出数据有缺失,但是解码器判断异常,出现无法正常解码的情况。这样就会出现网络接收帧率大于等于解码器输出帧率的现象。

5、解码器输出帧率

如第四小节描述,这里仅统计完整正确能解码出视频帧的帧率。

6、视频渲染帧率

这是最终将第一小节的视频采集卡视频显示给用户的界面。可能出现个别终端的渲染器性能比较差,解码出来的全部数据不一定能及时渲染出来。目前webrtc在这里没有增加特殊处理,要是渲染不及时就会累积,出现视频延时的现象。

四、总结

可以看出webrtc只有在发送端会有主动丢帧降帧率。其余的地方是由于网络丢包延时、编码性能、渲染性能导致被丢帧。

五、参考

https://blog.youkuaiyun.com/chinabinlang/article/details/79654852

http://www.enkichen.com/2017/07/29/webrtc-drop-frame/

 

WebRTC系列分享 | WebRTC视频QoS全局技术栈 当网络条件比较差的时候,码率降的比较低,若不降低帧率,视频质量会大幅度下降。JitterBuffer实现原理是,在收到网络上的RTP报文后,不直接进行解码,需要缓存一定个数的RTP报文,按照时间戳或者seq的顺序进行重排,消除报文的乱序和抖动问题。WebRTC的vpx编码器使用了Temporal Scalability时间可适性编码,仅需通过FEC+NACK方式保护T0层的数据完整性,其余层的视频帧有丢失,可通过逐级降帧率方案(丢弃Tn-T1之间的数据),保证视频通话整体的流畅性。 阅读详情

相关推荐

WebRTC Qos策略

WebRTC中pacer的流程比较清晰,分为三步:1)如果一帧图像被编码和RTP切分打包后,先会将RTP报文存在待发送的队列中,并将报文元数据(packet id, size, timestamp, 重传标示)送到pacer queue进行排队等待发送,插入队列的元数据会进行优先级排序。基于丢包率(loss-based )(发送端实现)发送端从接收端发送的 RTCP RR(Receiver Report)报文,根据 Report Block 中携带的丢包率信息,动态调整发送端码率。

yinshipin007的博客 986

webrtc QOS方法七(摄像头采集帧率调整)

一、发现问题 使用罗技C270摄像头,进行webrtc视频通话QOS测评时发现,在网络0延时,0丢包时,GetStats打印摄像头采集到的帧率一直持续在15-17fps,无法达到摄像头标注的30fps的采集能力。在17fps下视频通话,视频质量有轻微的顿挫感,流畅性不好。 检查CPU占有率、编码解码时间,都没有异常。按理来说性能是可以达到30fps的实时通讯能力的。 二、分析问题 1、首先...

CrystalShaw的博客 5404

WebRTC服务质量(01)- Qos概述

WebRTC 的 QoS 策略是一个复杂的多层动态优化过程,以实现实时音视频通信的高质量和低延迟。提高网络可靠性(NACK/RTX、FEC、JitterBuffer 等)。动态调整码率与带宽适配(拥塞控制、Transport-cc、主动丢包等)。降低数据发送量(SVC、Simulcast、动态帧率调整等)。延迟优化(Pacer、DTLS 优化、ICE 节点选择等)。音频质量优化(Opus 自适应、音频冗余编码、回声消除等)。设备性能适配(硬件加速、帧率和分辨率平衡等)。

Ziwubiancheng的博客 1453

webrtc QOS方法五.2(发送端帧率调整原理及实现流程)

一、MediaOptimization类作用 二、MediaOptimization类实现 1)编码前 实现原理 MediaOptimization在编码前,更新编码器的码率、帧率信息。 码率:会根据当前系统统计的编码后帧率、以及之前编码数据量与目标编码码率关系,评估当前合适的码率。 帧率: 函数调用 2)编码中 函数调用关系 实...

CrystalShaw的博客 5265

WebRTC系列-漏桶算法FrameDropper

本文将详细介绍WebRTC中QOS中对于帧率控制的核心方法,编码前帧的控制主要使用漏桶算法类DropFramel来控制是否丢弃某一个帧;通过本文你可以根据自己去调着漏桶算法,实现一些特殊的需求;

HOSTEN的博客 1079

WebRTC帧率调整策略

与实时视频相关参数包含:帧率、码率、时延、抖动等。帧率体现了视频的流畅性,要想达到较好的流畅性体验要求——网络视频帧率不低于24帧,视频会议帧率不低于15帧。在实际开发中,我们遇到了不少问题,主要包括:发送端帧率较低接收端帧率较低帧率波动较大本文主要研究WebRTC中的帧率调整策略,解决上述实际开发中帧率较低的问题,以期达到较好的流畅性体验。帧率计算方法帧率并非恒定值,帧率大小反映的是每秒多少视频...

chinabinlang的专栏 9952

WebRTC QoS方法(汇总篇)

目前总结出webrtc用于提升QOS的方法有: NACK、FEC、SVC、JitterBuffer、IDR Request、PACER、Sender Side BWE、VFR(动态帧率调整策略)。 这几种方法在webrtc架构分布如下: 具体实现原理如下: 一、NACK 与NACK对应的是ACK,ACK是到达通知技术。以TCP为例,他可靠因为接收方在收到数据后会给发送方返回一个“已收......

CrystalShaw的博客 2万+

WebRTC 抽帧实现视频解码器

在WebRTC中,视频解码是非常重要的一环,它将接收到的视频流进行解码并显示在用户界面上。这可以通过 WebRTC 的 API 实现,例如使用 getUserMedia 获取本地摄像头的视频流,并将其传递给解码器。这可以通过 WebRTC 的 API 实现,例如使用 RTCPeerConnection 接收来自发送端的视频数据,并将其传递给解码器。通过以上的步骤,我们成功地实现了一个使用 WebRTC 抽帧的视频解码器。上述代码中,我们在接收到视频轨道后,将其包装成媒体流,并将其显示在用户界面上。

KnBackend的博客 298

webrtc QOS方法五(帧率调整)

一、框架图 二、帧率调控算法 根据上图所示,发送端帧率调整算法有两个: 1、视频采集帧率与编码器输入帧率之间的FrameDropper算法。 2、编码器输入与编码器输出之间的MediaOptimization算法。 三、webrtc的帧率 如上框架图,webrtc的帧率从左到右,帧率是持递减状态的。摄像头的采集帧率是发送端帧率的极限值。 1、摄像头采集帧率 视频采集卡帧率能力集,可以通...

老衲不出家 2930

使用petalinux做嵌入式设计开发(1)

1.创建vivado工程,建立硬件环境,最终导出hdf文件 既可以在windows系统下的vivado上编写硬件工程并导出hdf文件,也可以在linux系统下的vivado中编写硬件工程并导出hdf文件。(对于windows系统下导出的hdf文件还需要传递到linux系统下的文件夹中。) 2.以hdf硬件文件为基础创建,配置,编译,打包petalinux工程,导出linux系统所需镜像文件。 具体步骤: (0)设置环境变量 设置环境变量使得我们可以直接使用petalin...

plotup的博客 2076

C语言面试,8道一定会遇到的----关于指针的笔试题详解

C语言面试,8道一定会遇到的----关于指针的笔试题详解

m0_55322924的博客 463

webrtc QOS方法(汇总篇)

看到一组很有价值分析QOS的文章,特意转载过来 原文:https://blog.csdn.net/CrystalShaw/article/details/80432267 感谢楼主   目前总结出webrtc用于提升QOS的方法有: NACK、FEC、SVC、JitterBuffer、IDR Request、PACER、Sender Side BWE、VFR(动态帧率调整策略)。 这几种方...

老衲不出家 2308

二手分析仪器改造实战:如何用PMT搭建荧光检测电路(附完整电路图)

本文详细介绍了如何利用二手分析仪器中的光电倍增管(PMT)核心部件,进行荧光检测电路的实战改造。内容涵盖从PMT工作原理理解、高压供电电路设计、低噪声前置放大(跨阻放大器)到信号调理的完整流程,并提供了关键电路图与调试排错指南,旨在帮助电子爱好者与工程师低成本构建稳定、高灵敏度的专业检测系统。

weixin_29234239的博客 441

WebRTC QoS处理

javascript// 调整视频编码参数degradationPreference: 'maintain-framerate', // 保持帧率优先}]});

深之JohnChen的专栏 1114

华为OD机试2025C卷-双十一最大花费金额[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率

双十一最大花费金额 - 动态规划解法 摘要:本文介绍了华为OD机试中"双十一最大花费金额"问题的动态规划解法。该问题要求在给定N件商品价格和优惠券面额X的情况下,选择若干商品使总花费不超过X且尽可能大。核心解法采用布尔型动态规划数组,记录每个金额是否可被拼出。算法时间复杂度为O(N*X),空间复杂度为O(X)。通过倒序遍历避免重复选择同一商品,最后从X向下查找第一个可达金额作为答案。文中提供了C++和Java的实现代码,并解释了与经典0-1背包问题的关系。 关键点: 问题本质是0-1背包/子集和问题的变体

2503_91057718的博客 46

107.在 Vue 3 中使用 OpenLayers 实现视图联动功能

是一个非常强大的 Web 地图渲染库,支持多种地图数据格式和交互操作。在 Vue 3 中,我们可以利用。绑定到真实的 DOM 元素上,我们就可以用它们来初始化 OpenLayers 地图。来封装和管理 OpenLayers 地图的状态,从而更高效地开发地图应用。,即两个地图窗口共享同一个视图(View),从而实现同步缩放、拖动等操作。这可以确保 Vue 组件销毁时,OpenLayers 也正确销毁地图实例。,并且它们会同步缩放和拖动,达到地图联动的效果。这样,无论你拖动哪个地图,另一个都会同步变化。

小彭的博客 1939

webrtc代码走读(二十一)-QOS系列13-帧率调控机制

WebRTC帧率调控通过全链路动态调整保障视频流畅性与画质平衡。核心机制包括:1)采集端根据摄像头性能与环境光调整帧率;2)编码端通过直接丢帧或漏桶算法应对编码性能不足与网络带宽限制;3)传输与解码端丢弃不完整帧确保稳定性。发送端作为调控重点,采用直接丢帧(应对编码瓶颈)与漏桶算法(平滑码率控制)两种策略,其中漏桶算法通过Fill-Leak-Drop流程实现帧率动态优化。该设计有效解决摄像头过载、编码瓶颈和网络波动等QOS问题,但渲染端堆积问题仍需优化。

qq_31065851的博客 1304

Spring AI Alibaba实战训练营-13语音生成应用开发指南

本文介绍了如何基于Spring AI Alibaba创建DashScope语音应用,支持文本转语音(TTS)和语音转文本(STT)功能。主要内容包括:1)环境准备要求Java 17+、Maven 3.6+及阿里云DashScope API Key;2)通过Spring Initializr创建项目并配置相关依赖;3)设置API密钥的安全配置方法;4)实现语音合成的同步和流式功能,包括创建控制器类、调用API接口及保存语音文件。文章提供了详细的代码示例和配置说明,帮助开发者快速搭建语音处理应用。

program哲学 403

webrtc QOS方法四(Sender Side BWE)

背景介绍 BWE(Bandwidth Estimation)可能是WebRTC视频引擎中最关键的模块了。BWE模块决定视频通讯中可以发送多大码率视频不会使网络拥塞,防止视频通讯质量下降。 早期的带宽评估算法比较简单,大多是基于丢包来估计,基本的策略是逐步增加发送的数据量,直到检测到丢包为止。为了让发送端获悉网络上的丢包信息,可以使用标准的RTCP的RR来发送周期性的报告。 现代的带宽评估算法...

CrystalShaw的博客 1万+

Transformer从菜鸟到新手(一)

从本文开始回顾一下Transformer的原理与实现细节,包括分词算法BPE的实现。最终利用从零实现的Transformer模型进行英中翻译。

日积月累,天道酬勤 2125

AI Agent开发大全第一课-AI是什么以及如何使用AI

近年来,人工智能的迅猛发展引发了广泛的关注,尤其是“大模型”这一概念越来越深入人心。大模型,顾名思义,通常指的是那些拥有大量参数、能够处理复杂任务的机器学习模型。与传统小模型相比,大模型在数据处理、信息理解和生成等方面表现更加出色。为了理解为什么现在的AI被称为大模型,我们需要深入探讨几个关键因素。立角色是指在提示词中清晰地界定交互双方的身份。明确用户希望模型扮演的角色,可以帮助模型更准确地理解上下文和用户需求。

打造全国最全的AI Agent开发知识领域的博客 1406

WebRTC QOS概念简述

Bandwidth Estimation REMB NACK FEC SVC JTBUFFER IDR Request

linux_vae的专栏 818

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: wireshark查看RTP报文丢包抖动方法
下一篇: webrtc QOS方法二.1(FEC原理)
CrystalShaw
CrystalShaw 领域专家: 网络协议与安全技术领域 领域专家: 网络协议与安全技术领域
博客等级 码龄9年 926粉丝 195原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值