webrtc QOS方法八(JitterBuffer)

卡尔曼滤波在Webrtc中应用的理解 总结了自己对卡尔曼滤波的理解以及卡尔曼滤波在webrtc中视频播放控制的应用。通过抽离webrtc代码并模拟数据输入加深对算法流程的理解。 阅读详情

一、前言

网上看到很多webrtc的JitterBuffer处理流程,都是介绍VCMJitterBuffer类的实现流程,不过手里的这个2019年的版本,发现webrtc已经不用这个机制了。原因还不清楚。

VCMJitterBuffer类的调用关系如下图,但是,VideoCodingModuleImpl、VideoReceiveStream、VideoStreamDecoder三个类,都没有调用VCMJitterBuffer的InsertPacket关键函数。

VCMJitterBuffer

->VCMReceiver

->VideoReceiver

->VideoCodingModuleImpl
    VideoReceiveStream 
    VideoStreamDecoder

二、实现简介

走读最新的webrtc的JitterBuffer代码,发现实现的大概思想是,视频按照RTP报入队一个全局buffer,按照计算的一个jitter时间,pop一帧视频,送进解码器。

 

三、RTP入队流程

入队的核心函数如下:

->video_coding::PacketBuffer::InsertPacket
-------------------------将RTP报文缓存在data_buffer_中。

->RtpVideoStreamReceiver::OnReceivedFrame
-------------------------判断首帧是否是IDR,不是丢弃帧;是,调用ManageFrame。

->video_coding::RtpFrameReferenceFinder::ManageFrame
-------------------------判断帧间参考关系。若当前帧的参考帧没到,继续等。

->RtpVideoStreamReceiver::OnCompleteFrame
-------------------------继续传VideoReceiveStream::OnCompleteFrame

->internal::VideoReceiveStream::OnCompleteFrame
-------------------------继续传FrameBuffer::InsertFrame

->video_coding::FrameBuffer::InsertFrame
--------------------------对当前帧的参考关系、时间戳进行合法性判断。合法帧发送信号量,知会解码器取数据。

 

四、视频帧出队流程

出队的核心函数为:

->bool VideoReceiveStream::Decode

-------------------------解码器找frame_buffer要数据。配置等待超时时间kMaxWaitForFrameMs或kMaxWaitForKeyFrameMs

->FrameBuffer::ReturnReason FrameBuffer::NextFrame

-------------------------若当前帧OK,直接送给解码器。若当前帧不全,需要等wait_ms,超过wait_ms,直接跳下一帧。

->VCMTiming::MaxWaitingTime

--------------------------计算当前帧解码时间是否到,到就出帧,否则就等待。

等待时间=当前帧预计渲染时间-解码消耗时间-渲染模块耗时

因为这里是解码前,所以要把后面的解码+渲染时间扣除。

五、render_time_ms计算

VCMTiming::RenderTimeMs函数实现视频帧渲染时间的计算。

VCMTiming::RenderTimeMs

->VCMTiming::RenderTimeMsInternal

->VCMTiming::TargetDelayInternal

一帧视频的预期渲染时间是发送端发送时间+网络延时时间+解码时间+渲染模块耗时时间

发送端发送时间:可以根据发送报文的时间戳+接收第一帧视频的系统时间推算出来。

网络延时时间:可以参考《webrtc代码走读十六(Jitter延时的计算)》

解码时间:使用KalmanFilter算法,计算每帧视频解码时间。

渲染时间:根据硬件配置,是固定值。

1)发送端发送时间计算函数

TimestampExtrapolator::ExtrapolateLocalTime

2)网络延时时间计算函数

VCMJitterEstimator::GetJitterEstimate

3)解码时间计算函数

VCMCodecTimer::RequiredDecodeTimeMs

4)渲染时间

VideoReceiveStream::VideoReceiveStream函数

video_receiver_.SetRenderDelay(config_.render_delay_ms)代码配置固定值

六、渲染前判断wait_time

IncomingVideoStream::OnFrame

VideoRenderFrames::FrameToRender

 

 

 

 

webrtc之精读预期接收时间设置及其更新过程 目录 前言 卡尔曼滤波核心5大公式 期望接收时间和rtp时间戳之间的关系 update过程 ExtrapolateLocalTime过程 前言 在video jitter buffer中讲述过video在insert frame buff时会调用TimestampExtrapolator::update来更新卡尔曼增益,然后在nextframe中获取期望接收时间来进行预估输出期望时间。本节将尽本人最大的努力来讲述下这个过程,虽然看了很多文章,还是对卡尔曼滤波这个过程一知半解,不过代码还是看 阅读详情

相关推荐

WebRTC Qos优化杂记

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

sonysuqin的专栏 6678

WebRTC QOS方法十三.1(TimestampExtrapolator接收时间预估)

虽然我们可通过时间戳的差值和采样率计算出发送端视频帧的发送节奏,但是由于网络延迟、抖动、丢包,仅知道视频发送端的发送节奏是明显不够的。我们还需要评估出视频接收端的视频帧的接收节奏,然后进行适当平滑,保证渲染的效果。WebRTC引入了卡尔曼滤波,通过视频时间戳和到达时间进行调整,提高后续视频帧到达时间估算的准确性和稳定性。TimestampExtrapolator就是实现视频帧的到达时间的估算。在实际的网络环境中,由于网络波动、设备性能差异等因素,接收到的视频帧时间戳往往包含噪声。

CrystalShaw的博客 1397

webrtc视频jitterbuffer全网最详细分析

还要注意的一点是,虽然我画的横轴每个时间戳是均匀的,但实际每帧数据的时间戳并不一定非要按照固定时间等间隔增长,每帧视频数据的时间戳应该由采集时刻决定按照采集的时刻进行设置,这样最终的渲染时间也会落到最上方的黑色虚线上,并且渲染每帧的间隔和采集每帧数据的间隔也是一样的。如果发送端采集的时刻有抖动,时间戳强行设置均匀增长,那么经过去抖动模块后渲染每帧数据的时间间隔虽然是均匀的,但并不是发送端采集每帧数据的时刻的间隔,这样做不仅不会优化抖动,反而会引入抖动。去抖动引入的延时就会越小。

m0_74823963的博客 1542

webrtc-m79-视频相关的VCMTiming 中几个 delay 的更新

1 参考链接 https://blog.youkuaiyun.com/lipku/article/details/104124569 https://blog.youkuaiyun.com/sonysuqin/article/details/107297157 多谢各位的付出。 2

hclbeloved的博客 1183

WebRTC系列分享 | WebRTC视频QoS全局技术栈

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

yinshipin007的博客 837

【粗读webrtc】 jitterbuffer1: VCMJitterBuffer

VCMJitterBuffer VCMJitterBuffer 是JB的核心类了把 2019年的版本,webrtc已经不用这个机制了 收到视频数据解析出rtp包后,会调用InsertPacket 插入JB中 //向frame中插入一个包,frame是GetFrame() 返回的,如果GetFrame 返回值小于等于0, //那么,这个frame是无效的,那么InsertPacket 返回后,这个(frame指针??)必须丢弃。 // Inserts a packet into a frame ret

突围 1039

【网络通信 -- WebRTC】WebRTC 服务质量 (QoS) -- JitterBuffer

【网络通信 -- WebRTC】WebRTC 服务质量 (QoS) -- JitterBuffer 【1】基本概念 JitterBuffer 是在收到网络上的 RTP 报文后,不直接进行解码,而是缓存一定个数的 RTP 报文,并按照时间戳或者序列号的顺序进行重排,以消除报文乱序和抖动问题的技术; JitterBuffer 分为动态 JitterBuffer 和静态 JitterBuffer; 静态 JitterBuffer 缓存报文个数固定; 动态 JitterBuffer 根据网络环路延时的情况,

CopperSun 技术博客 1520

Android OTA 升级实战指南:从原理到实现

本文详细解析了Android OTA升级的原理与实现方法,包括AB升级与Recovery升级的机制对比、OTA升级包制作流程以及应用层升级功能的实现。通过实战案例和常见问题排查指南,帮助开发者掌握Android系统无线升级技术,提升设备维护效率。

weixin_42652674的博客 199

WebRTC QoS方法(汇总篇)

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

CrystalShaw的博客 2万+

双硬盘下Ubuntu 16.04与Win10双系统的安装

之前写过一个双系统安装过程,今天再次整理的原因是想重点强调双硬盘的区别。标红的一定要注意看,那就是我自己一步一步踏出来的坑啊...   基础步骤就不再重复,重点讲区别,需要看详细步骤的童鞋(或者你只有一个硬盘)请看我上一篇博客https://blog.youkuaiyun.com/weixin_40308540/article/details/80157444   区别:双硬盘和单硬盘的区别是什么呢?...

不吃包子 1124

5G NR PDCCH实战解析:从DCI格式到CORESET配置的完整指南

本文深入解析5G NR PDCCH的实战配置,涵盖DCI格式选择、CORESET配置及Search Space优化等关键内容。基于3GPP R16标准,提供现网部署中的典型问题解决方案,如覆盖边缘失步、多用户调度冲突等,帮助提升控制信令传输效率。特别针对5G NR PDCCH的灵活资源分配和自适应编码机制进行详细探讨。

weixin_29231263的博客 499

流媒体弱网优化之路(WebRTC)——jitterbuffer分析与优化

流媒体弱网优化之路(WebRTC)——jitterbuffer分析与优化 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost 目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全配置,提供全面的可视化算法观察能力。 欢迎大家使用! 文章目录流媒体弱网优化之路(WebRTC)——jitterbuffer分析与优化一、jitterbuffer原理二、jitterbuffer的实现三、framebuf

qw225967的博客 9371

ros2的unity仿真配置(ros2-for-unity)

可以看到unity中输出了Hello World,验证完毕!可以看到unity上监听的/chatter。

m0_63671696的博客 4093

webrtc QOS方法(汇总篇)

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

老衲不出家 2308

泛微Ecology流程数据表结构解析:workflow_requestbase和workflow_currentoperator到底怎么关联查询?

本文深入解析泛微Ecology系统中workflow_requestbase和workflow_currentoperator表的结构与关联机制,提供SQL查询语句示例,帮助开发者高效查询流程数据。涵盖待办事项、已办事项、办结事项和流程监控等典型场景,并分享性能优化技巧和常见问题排查指南。

weixin_33738555的博客 813

Python 爬虫实战:医学临床指南爬取(含 PDF 解析与结构化存储)

在当今数字化时代,医学临床指南作为医生进行科学诊疗的重要参考资料,包含大量经过临床验证的诊疗路径和建议。这些指南通常发布在权威医学网站上,数量庞大且更新频繁。如何自动化地抓取并存储这些指南,成为医疗数据分析、医学研究以及医疗 AI 模型训练等工作的关键第一步。本文将系统讲解如何利用 Python 爬虫技术从权威医学网站爬取临床指南内容,并实现 PDF 解析与结构化存储。

u014481728的博客 450

webrtc jitterbuffer--buffer草稿

webrtc的jitterbuffer按照功能分类的话,可以分为jitter和buffer。buffer主要对丢包、乱序、延时到达等异常情况做处理,还会和NACK、FEC、FIR等QOS相互配合 第一部分 新版jitter buffer 整体结构: PacketBuffer:负责帧的完整性,保证组成帧的每个包序列号连续,并且有一个包标识帧的开始,有一个包标识帧的结束; RtpFrameReferenceFinder:帧参考关系寻找.负责给每个帧设置好参考帧,同时兼顾GOP内各帧的连续性; Fr

fdsafwagdagadg6576的专栏 1283

Unity的粒子系统使用shadergraph(内置管线)制作的一个顶点偏移shader,但是粒子模型移动时,顶点也会偏移?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1174

WebRTC|用QOS技术做音视频质量性能优化

随着GPT-4的发布,AI的风越吹越旺。GPT-4可以回答问题,可以写作,甚至可以基于一张草图生成html代码搭建一个网站。即构社区的一位开发者@倪同学就基于目前在研究的WebRTC QOS技术点对GPT-3.5跟GPT-4进行一场实验,ChatGPT会取代程序员还是成为最强辅助?

即构开发者博客 7729

RT-DETR改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU等)

本文记录的是改进RT-DETR的损失函数,将其替换成。现有研究通过利用边界框之间的几何关系来提高回归性能,但忽略了困难样本和简单样本分布对边界框回归的影响。不同检测任务中困难样本和简单样本的分布不同,对于简单样本占主导的检测任务,关注简单样本的边界框回归有助于提高检测性能;对于困难样本比例较高的检测任务,需要关注困难样本的边界框回归。,提高检测器在不同检测任务中的性能。实现的。

Limiiiing的博客 1922

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

webrtc视频jitterbuffer原理机制(描述版)

前言 如果网络是理想的,即无丢包,无抖动,低延时,那么接收到一帧完整数据就直接播放,效果也一定会非常好。但是实际的网络总是复杂的,尤其无线网络。如果还是这样直接播放,网络稍微变差,视频就会卡顿,出现马赛克等。所以,在接收端对接收的数据做一个缓冲是很有必要的。 缓冲一定是以延时作为代价的,延时越大,对抖动的过滤效果越好。一个优秀的视频jitterbuffer,不仅要能够对丢包、乱序、延时到达等异常情况做处理,而且还要能够让视频平稳的播放,尽可能的避免出现明显的加速播放和缓慢播放。 主流的实时音视频框架基本

zz460833359的博客 2411

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WebRTC QOS概念简述

Bandwidth Estimation REMB NACK FEC SVC JTBUFFER IDR Request

linux_vae的专栏 818

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

metaRTC/webRTC QOS 方案与实践

质量服务(QOS/Quality of Service)是指利用各种技术方案提高网络通信质量的技术,拥塞控制是各种技术的数据基础,丢包恢复解决丢包问题,抗乱序抖动解决网络乱序抖动问题,流量控制解决平顺发送数据/数据超带宽负载/延时问题。

metaRTC的博客 3704
上一篇: webrtc代码走读十五(X264编码FEC弱网效果差问题解析)
下一篇: 一点感悟
CrystalShaw
CrystalShaw 领域专家: 网络协议与安全技术领域 领域专家: 网络协议与安全技术领域
博客等级 码龄9年 926粉丝 195原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值