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

devtools/2024/12/29 1:39:00/

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.ppmy.cn/devtools/146262.html

相关文章

IP组播基础

点到多点业务&#xff1a;比如IPTV、视频会议等&#xff0c;可以使用组播、广播、单播承载&#xff0c;比如A,B,C都要收看视频X 单播会占用大量带宽&#xff0c;导致服务器压力极大 广播会发送给所有的终端&#xff0c;存在安全隐患 组播会避免上面两个方式的问题 IP组播基…

嵌入式单片机中Flash存储器控制与实现

第一:嵌入式单片机内部Flash概述 1.存储器的概念 存储器指的是若干个存储单元的集合,每个存储单元都可以存储若干个二进制数,为了方便的操作存储单元,就为每个存储单元都分配了地址,就可以通过寻址来访问存储单元。由于计算机的处理的数据量较大,并且运算速度都很快,就…

Max AI prompt2:

1&#xff0c;prompt1——总体概览 “请根据以下指导原则撰写文献解读&#xff0c;特别关注作者的研究思路和方法论&#xff1a; 1. 研究背景与目的&#xff1a; 概述文章研究的背景&#xff0c;明确研究的主要目的和研究问题。 2. 研究思路&#xff1a; 详细描述作者如何构建…

【网络安全】Web安全基础- 第一节:web前置基础知识

目录 前言一、 中间件 1.1消息中间件1.2数据库中间件1.3web服务器中间件1.4应用服务器中间件1.5远程过程调用中间件 二、源码 **组成部分&#xff1a;** 1、**前端&#xff08;客户端&#xff09;代码&#xff1a;**2、**后端&#xff08;服务器端&#xff09;代码**&#xff…

【人工智能离散数学基础】——深入详解图论:基础图结构及算法,应用于图神经网络等

深入详解图论&#xff1a;基础图结构及算法&#xff0c;应用于图神经网络等 图论&#xff08;Graph Theory&#xff09;是数学中研究图这种离散结构的分支&#xff0c;广泛应用于计算机科学、网络分析、人工智能等领域。随着图神经网络&#xff08;Graph Neural Networks, GNNs…

ByConity BSP 解锁数据仓库新未来

文章目录 前言BSP 模式简介基于 TPC-DS 的 ELT 活动测试环境登录 ECS数据查询配置 执行 02.sqlsql解释&#xff1a;1. 第一步&#xff1a;创建 wscs 临时表2. 第二步&#xff1a;创建 wswscs 临时表3. 第三步&#xff1a;对比 2001 年和 2002 年的数据子查询 1&#xff1a;提取…

html 通用错误页面

因为业务业务需求&#xff0c;需要做一个错误的页面&#xff0c;避免出现错误信息或者相关业务信息泄露&#xff0c;所以在Nginx配置一个通用错误页面。 完成后页面访问路径&#xff1a; /error.htmlstatus500&uri/user&time_local2024年7月29日10:16:04&remote_ad…

Mysql高级部分总结(二)

MySQL的内部日志 binlog记载的是update/delete/insert这样的SQL语句,而redo log记载的是物理修改的内容(xxxx页修改了xxx)。 binlog无论MySQL用什么引擎,都会有,而redo log是MySQL的InnoDB引擎所产生的。 redo log事务开始的时候,就开始记录每次的变更信息,而binlog是在…