WebRTC音视频同步原理与实现详解(下)

WebRTC音视频同步原理与实现详解(上)

第四章、音视频同步实现详解

4.1 音视频同步标准

音视频做到什么程度才算是同步呢?

关于音画同步, 业界有3个标准:

1)ITU-R BT.1359(1998):国际电信联盟标准

2)ATSC IS/191(2003):美国的数字电视国家标准

3)EBU R37(2007):欧洲广播联盟标准

目前在音视频同步方面影响最大的国际标准是,ITU-R BT.1359-1,该标准的评测者既包括专家, 也包括一般人,采用5级评分标准,给出的答案是:

3ef7e2c723e47acce4a2dfd032230b9e.png

fc1d72ee0fc863bc9ee8effaeddc4bf9.png

delay time是用视频延迟减去音频延迟,负数(-)表示音频延迟更大,正数(+)表示视频延迟更大。

4.2 同步器与延迟调整

4.2.1 音视频同步器

音视频同步器,就是负责将音频和视频流同步播放。

a58f1393a80bfea705a21dc8381fc59b.png

图中中间大框架里就是整个同步器,同步器输入包括三部分:

1)期望音频目标延迟,以该延迟播放,音频是流畅的

2)期望视频目标延迟,以该延迟播放,视频是流畅的

3)最近一对音视频包的相对延迟

同步器输出,包括两部分:

1)音频目标延迟

2)视频目标延迟

音视频相对延迟:音视频目标延迟差 - 最近一对音视频包相对延时

3acfd0aae21fa537a086309b9fd35953.png

4.2.2 调整延迟

1)音视频目标延迟,取期望目标延迟与最小播放延迟的最大值。

65adc2571301e927dcf25d143ef761d1.png

最近一对音视频包的相对延迟与音视频的目标延迟差之和,得到当前时刻的音视频相对延迟,即音视频流目前的时间偏差,计算当时相对延迟,并使用滑动平均算法处理,减少噪声和干扰的影响。滑动平均算法公式:

f0360a6bb12e88084c9305b2dcd97d14.png

其中,k表示平滑滤波器的窗口大小,用于计算滑动平均值的权重系数(代码中kFilterLength= 4),y表示平滑滤波器的滑动平均值,x表示当前样本值,这里是相对延迟

2)计算音视频的延迟

为了控制步长,相对延迟diff_ms是平滑的相对延迟的一半,并限制单次在80ms范围之内,如果是30ms以内,则认为是同步的,不需要调整。

当diff_ms > 0,说明视频比较慢,再进行视频延迟与基准(默认0)比较:

a4e985371cbade39ab92fbc0327f73f7.png

  • 如果video_delay_.extra_ms > base_target_delay_ms_,减小视频流延迟,设置音频延迟为基准;

  • 如果video_delay_.extra_ms <= base_target_delay_ms_,增大音频流延迟,设置视频延迟为基准。

当diff_ms < 0,说明音频比较慢,再进行音频延迟与基准(默认0)比较:

c9035fa68fcf739a7c3ba159f7f68a5d.png

  • 如果audio_delay_.extra_ms > base_target_delay_ms_,减小音频流延迟,设置视频延迟为基准;

  • 如果audio_delay_.extra_ms <= base_target_delay_ms_,增大视频流延迟,设置音频延迟为基准。

3)同步策略

当视频相对音频存在播放延迟时,如果视频已经存在延迟,减小视频播放延迟,通过快放追上音频;如果视频没有延迟,无法再降低,增加音频延迟,让音频慢放等待视频。当音频相对视频存在播放延迟时,如果音频已经存在延迟,减小音频播放延迟,通过快放追上音频;如果音频没有延迟,无法再降低,增加视频延迟,让视频慢放等待音频。

经过了以上校准之后,输出了同步后音频、视频流的最小播放延迟audio_delay_.extra_ms和video_delay_.extra_ms。

4.3 设置音频延迟

前面计算出音频、视频流的最小播放延迟audio_delay_.extra_ms和video_delay_.extra_ms,extra_ms含义是音视频同步过程增加了多少的延迟,一开始是0,在同步的过程会慢慢收敛,不断累计。

理论上将这两个延迟分别施加到音频和视频流播放上,音视频就可同步,但是为了播放流畅,还要考虑网络延迟,因此,再进一步分别与音频期望目标延迟、视频期望目标延迟比较,取最大值。音频延时设置代码:

33a0132caaeaa5fac36ac0b29c816a1c.png

调用SetMinimumPlayoutDelay,会调用并设置到DelayManager中:

e7f41c2f9f0c66260b35648304d2da57.png

将delay_ms赋值给minimum_delay_ms_,这个值限制了最小播放延时,即限制 effective_minimum_delay_ms_的最小值。

275755bc152c41c6a557ef7b1ea9a792.png

2bc498ec1c0bd64522ef1dd94e244c67.png

其中,MinimumDelayUpperBound是控制delay不能超过75%的max packet buffer的大小。

那effective_minimum_delay_ms_的使用?

在计算网络延时使用,target_level_ms取target_level_ms_和 effective_minimum_delay_ms_的最大值。

fc70fcb39885117827819eb11fe0e545.png

4.4 音频输出控制

同步器输出了音频目标延迟后,设置到NetEQ中,参与NetEQ的Decision策略决策:

29bd1c4cda40f7c39122b936d3276afb.png

如果音频当前延迟小于3 / 4音频目标延迟,也就是缓存数据较少,需要减速播放等待目标延迟;如果音频当前延迟大于音频目标延迟,也就是缓存数据过多,需要加速播放追赶目标延迟;如果音频当前延迟大于4 * 音频目标延迟,返回快加速。

音频就是以缓存长度追赶目标延迟的方式达到延迟一定时间的效果,最终和视频的目标延迟对齐后,实现了音视频同步。代码实现:

e16f88d9d42ffd96e0bce28d9e400588.png

target_level_ms_就是target_buffer_level,网络抖动延时

buffer_level_samples是当前jitter buffer size

1)首先计算网络延迟的最低和最高延时范围

将lower_limit设置为target_buffer_level的3/4与target_buffer_level - 85ms/2两者最大,higher_limit设置为target_buffer_level与lower_limit +20ms/packet_len_ms_两者最大。

2)比网络延迟的最大延迟的4倍要高,返回快加速。

3)抖动延时超过了网络延迟的最大延迟,表示抖动缓冲区包累积较多,返回加速播放。

4)抖动延时小于网络延迟的最小延迟,表示抖动缓冲区包较小,返回减速。

4.5 设置视频延迟

计算出目标延迟后,设置到视频同步(即视频接收流)。

42fd02807d76ef62eb50174353dd5786.png

96411b5397a814c6020c957a758f3925.png

将delay_ms赋值给syncable_minimum_playout_delay_ms_,更新minimum_delay_ms为syncable_minimum_playout_delay_ms_(因为其他两个是0)

9168e234642ecaa62be33b5dce88b773.png

再设置到VCMTiming中:

a69a339b727807f4a8144805a5a1c842.png

即赋值给min_playout_delay_ms_。

最后,在rendertime中生效

ce50b28d48b7ec41d26f88109e12bad2.png

Render time即是这帧数据渲染的时间:

9ccdbfd7cc4a07890289c4d22946eaee.png

b7183e9c9a19f9900ad41ba814e036d2.png

4.6 视频渲染时间

视频渲染总框架:

d47fd17981bb2e5b2c26037c851fb664.png

1)视频目标延迟、视频当前延迟

2)视频最小播放延迟,来自同步器校准结果

3)期望接收时间,用于平滑渲染时间

视频帧渲染时间即是帧平滑时间与视频实际延迟之和。

4.7 期望接收时间

期望接收时间,即帧平滑时间。

FrameBuffer每获得一个可解码帧,都要更新其渲染时间,渲染时间通过TimestampExtrapolator类获得,是一个卡尔曼滤波器,其输入为帧的RTP时间戳和本地接收时间观测值,得到视频帧最优的期望接收时间,用于平滑网络的抖动。

TimestampExtrapolator会根据输入帧的时间戳的间隔计算输出渲染时间,目标是平滑输出帧的时间间隔。

e65ffa9854c0c226011be629af4ae886.png

1)每收到一帧,会记录该帧的RTP时间戳Tframe_rtp和本地接收时间Tframe_rcv,其中第一帧的RTP时间戳为Tfirst_frame_rtp和本地接收时间Tfirst_frame_rcv。

2)记帧RTP时间戳之差:Tframe_rtp_delta = Tframe_rtp - Tfirst_frame_rtp

3)帧本地接收时间之差:Tframe_recv_delta = Tframe_recv - Tfirst_frame_rcv

4)两者为线性关系,期望RTP时间戳之差Tframe_rtp_delta= _w[0] * Tframe_recv_delta + _w[1]

5)通过卡尔曼滤波器得到线性系数_w[0]、_w[1],进而得到期望接收时间的值:

Tframe_recv= Tfirst_frame_rcv + (Tframe_rtp_delta - _w[1]) / _w[0]

4.8 更新视频当前延迟

FrameBuffer每获得一个可解码帧会调用一次,更新当前延迟,最终用于计算渲染时间

aa5862bd81e41fa2348eb5c3b2911fda.png

render_time_ms为期望渲染时间,actual_decode_time_ms为实际解码时间。

获取目标延迟target_delay_ms,即抖动、解码时间、渲染时间与最小播放延迟的最大者,是播放当前帧总体的期望延迟,作为当前延迟的参考值。

期望解码时间为render_time_ms 与decode_time - render_time之差。

帧延迟delayed_ms 为actual_decode_time_ms与期望解码时间之差。

如果发生延迟,直接退出,不更新,如果有延迟,调整当时延迟,逼近目标延迟。

第五章、音画同步测量方法

本方介绍一种声控测量方法,需要购买辅助机搭建材料。

5.1 材料清单

PCB板:1块

LED灯:1个 长脚为正极

电阻:4个,分别是R1-2K、R2-1M、R3-10K、R4-100

电容:2个,分别是C1-1μ,C2-100μ, 长脚为正极

麦克风:1个

三极管:2个 S9013

电池和连接线若干

5.2 辅助板搭建图示

75ee11f0fdb871411b0d9806868b0627.png

使用上面材料按这个电路图连接即可。

5.3 测试方法

1)下载标准音画同步视频“YHTB.MP4”到测试设备。

2)将接收画面与辅助机放在同一个画面里。

3)使用其他手机进行拍摄,帧率设置为240fps,进行拍摄录制。

4)将拍摄录制放到电脑中,使用播放器逐帧查看,比如AviDemux播放器。

ee3c75075f7a4fbcb072152a5c2607f9.png

5)计算同步时差

第一步,记录白色方块过“0”点的时间T1。

f598ef713f88b0e872249e55f0d427a8.png

第二步,逐帧查看直到LED灯被点亮的第一帧,记录时间T2

00859d294aa008558c92605b12e6c8bb.png

两次时间差T2-T1,就是音画同步的延时T,即T=T2-T1。

第六章、总结

本文从RTP及NTP时间戳、音视频同步原理、目标延迟及同步实现4个方面,由简入繁地讲解WebRTC音视频同步的原理与实现。

1)RTP及NTP是WebRTC音视频同步的基石,没有这两个时间基准,通信的两端是无法进行同步的。

第一部分,介绍音频和视频RTP时间戳的不同计算和生成方法。

第二部分,介绍RTP与NTP的对应关系,如何通过SR包来获取RTP与NTP的线程关系,通过这个线程关系,可以通过RTP求对应的NTP时间戳。

2)介绍音视频的同步原理及常见的几种同步方法。

3)介绍如何求音视频的相对延迟、期望延迟、目标延迟,最小延迟。

4)介绍音视频同步的实现,以及代码实现。

5)介绍音画同步的测量方法。

总结一句就是通过求目标延迟,对音频的播放和视频的渲染施加各自的延迟,即可达到同步,也可达到流畅。

音视频同步总框图:

8b7b51e9906304c05f8d1b923db56b03.png

若出现了音画不同步的问题,先通过测量方法确认哪个源快,无论是音频还是视频快,需要分析一方慢的原因,可以从整条链路的各个环节去排查:录制、编码时间、Pacer、网络、JitterBuffer大小、解码时间、渲染时间等。若慢的一方无法再优化、加快,那只能将快的一方加延时放慢等待。为了低延迟和提升用户体验,我们优先去优化、加快慢的一方。

参考文献

(1)《RTCP协议与实战》

https://blog.csdn.net/weixin_38102771/article/details/121866968

(2)《WebRTC音视频同步》

https://blog.csdn.net/xiehuanbin/article/details/133810695

(3)《WebRTC音视频同步详解》

https://blog.csdn.net/sonysuqin/article/details/107297157

(4)WebRTC源码https://webrtc.googlesource.com

(5)RTP官方文档 https://datatracker.ietf.org/doc/html/rfc3551

c351c927898cfb27382e80993469511f.jpeg

Google VINTF机制经验总结

10分钟了解OPPO中间件容器化实践

利用ADPF性能提示优化Android应用体验

b5f0be7495cd827770e02d58706fab74.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.系统学习-线性回归

系统学习-线性回归 前言线性回归介绍误差函数梯度下降梯度下降示例 回归问题常见的评价函数1. MAE, mean absolutely error2. MSE, mean squared error3. R square &#xff08;决定系数或R方&#xff09; 机器学习建模流程模型正则化拓展阅读作业 链接: 2.系统学习-逻辑回归 …

Oracle 日常巡检

1. 检查服务器状态 1.1. CPU使用情况 1.1.1. top top 命令是 Linux 和 Unix 系统中用于显示实时系统状态的工具&#xff0c;特别是对于监控 CPU 和内存的使用非常有用。 在命令行中输入 top&#xff0c;top 会显示一个实时更新的界面&#xff0c;其中包含系统的关键指标&am…

熊军出席ACDU·中国行南京站,详解SQL管理之道

12月21日&#xff0c;2024 ACDU中国行在南京圆满收官&#xff0c;本次活动分为三个篇章——回顾历史、立足当下、展望未来&#xff0c;为线上线下与会观众呈现了一场跨越时空的技术盛宴&#xff0c;吸引了众多业内人士的关注。云和恩墨副总经理熊军出席此次活动并发表了主题演讲…

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码&#xff1f; 前言什么是 GitHub1s&#xff1f;使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

3D布展平台主要有哪些功能?有什么特点?

3D布展平台是一种利用3D技术和虚拟现实&#xff08;VR&#xff09;技术&#xff0c;为用户提供线上虚拟展览和展示服务的平台。这些平台通常允许用户创建、设计和发布3D虚拟展厅&#xff0c;从而提供沉浸式的展览体验。以下是对3D布展平台的详细介绍&#xff1a; 一、主要功能 …

TowardsDataScience 博客中文翻译 2018~2024(一百二十三)

TowardsDataScience 博客中文翻译 2018~2024&#xff08;一百二十三&#xff09; 引言 从 2018 年到 2024 年&#xff0c;数据科学的进展超越了许多技术领域的速度。Towards Data Science 博客依然是这个领域的关键平台&#xff0c;记录了从基础工具到前沿技术的多方面发展。…

Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程

简介 Docker 通过提供轻量级、可移植和高效的解决方案&#xff0c;彻底改变了软件开发和部署。docker build 命令是 Docker 镜像创建过程的核心。本文将探讨 docker build 命令、其语法、用法以及优化 Docker 构建的最佳实践。本教程的目标是手把手教你如何在 Linux 服务器上使…

Springboot应用开发:配置类整理

目录 编写目的 一、线程池 1.1 setCorePoolSize 1.2 setMaxPoolSize 1.3 setQueueCapacity 1.4 setKeepAliveSeconds 1.5 setThreadNamePrefix 1.6 setRejectedExecutionHandler 1.7 示例代码 二、Durid数据库连接池 2.1 ServletRegistrationBean 2.2 FilterRegist…

【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 一、Bean的作用域 在 Java Spring 框架中&#xff0c;Bean 的作用域是一个关键概念&#xff0c;它决定了 Bean 的生命周期和实例化方式&#xff0c;对应用的性…

Excel 列名称转换问题 Swift 解答

文章目录 摘要描述题解答案Swift 实现代码&#xff1a;题解代码分析示例测试及结果 时间复杂度空间复杂度总结未来展望参考资料 摘要 本篇文章将通过 Swift 编程语言解答一个常见的算法问题&#xff1a;给定一个整数 columnNumber&#xff0c;将其转换为 Excel 表中的列名称。…

基于艾伦方差的频率稳定性分析

某个授时系统通过串口或网口采集时间间隔计数器、频率计数器、相位噪声分析仪设备的重要信息,用于评估和分析频率源的频率稳定度,确保测量的准确性和可靠性。 数据处理: 读取保存在文件中的时间间隔计数器测量的时差数据,计算时间稳定度(用TDEV表示)并保存。TDEV包括秒稳…

秒鲨后端之MyBatis【1】环境的搭建和核心配置文件详解

​ 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff…

虚幻引擎结构之ULevel

在虚幻引擎中&#xff0c;场景的组织和管理是通过子关卡&#xff08;Sublevel&#xff09;来实现的。这种设计不仅提高了资源管理的灵活性&#xff0c;还优化了游戏性能&#xff0c;特别是在处理大型复杂场景时。 1. 场景划分模式 虚幻引擎采用基于子关卡的场景划分模式。每个…

CentOS7下的vsftpd服务器和客户端

目录 1、安装vsftpd服务器和ftp客户端&#xff1b; 2、配置vsftpd服务器&#xff0c;允许普通用户登录、下载、上传文件&#xff1b; 3、配置vsftpd服务器&#xff0c;允许anonymous用户登录、下载、上传文件&#xff1b; 4、配置vsftpd服务器&#xff0c;允许root用户登录…

系统思考—全局思维

昨天接到一个企业需求&#xff0c;某互联网公司VP希望N-1的核心团队一起学习系统思考&#xff0c;特别是在新业务快速发展的阶段。公司增长势头不错&#xff0c;但如何解决跨部门的协作问题&#xff0c;成为了瓶颈。全局思维就是关键。产品、技术、市场、运营、客服……如何打破…

美国加州房价数据分析01

1.项目简介 本数据分析项目目的是分析美国加州房价数据&#xff0c;预测房价中值。 环境要求&#xff1a; ancondajupyter notebookpython3.10.10 虚拟环境&#xff1a; pandas 2.1.1 numpy 1.26.1 matplotlib 3.8.0 scikit-learn1.3.1 2. 导入并探索数据集 通用的数据分析…

LabVIEW软件开发的未来趋势

LabVIEW软件开发的未来趋势可以从以下几个方面来分析&#xff1a; ​ 1. 与AI和机器学习的深度结合 趋势&#xff1a;LabVIEW正在向集成AI和机器学习方向发展&#xff0c;尤其是在数据处理、预测性维护和自动化控制领域。 原因&#xff1a;AI技术的普及使得实验和工业场景中的…

使用Amazon Bedrock的无服务器的智能工作流

使用Amazon Bedrock的无服务器的智能工作流 智能工作流基于用户输入处理不可预见的任务&#xff0c;比如发起API调用。无服务器架构可以高效地管理这些任务和不同的工作负载&#xff0c;而无需维护服务器&#xff0c;从而加快部署速度。 你将学习如何通过使用带有保护措施的智能…

近实时”(NRT)搜索、倒排索引

近实时&#xff08;Near Real-Time, NRT&#xff09;搜索 近实时&#xff08;NRT&#xff09;搜索是 Elasticsearch 的核心特性之一&#xff0c;指的是数据在被写入到系统后&#xff0c;可以几乎立即被搜索和查询到。虽然它不像传统数据库那样完全实时&#xff0c;但它的延迟通…

【NACOS插件】使用官网插件更换NACOS数据库

说明 nacos 2.3.1默认支持mysql和derby数据库&#xff0c;如果想要支持其他数据库&#xff0c;可以通过使用插件方式实现。对于该插件的使用&#xff0c;官方说明文档较为粗略(不过也没问题&#xff0c;实际上整个过程就是很简单&#xff0c;只是使用者想复杂了)&#xff0c;网…