音视频同步原理及同步策略概述

一、概述

在视频播放的过程中,既能听到视频画面的声音也能看到视频画面,而且人物、画面的出现时机和场景都能和对应的口型(声音)对的上。即视频画面和声音要同步。假如音画不同步,画面和声音就会错乱。而视频画面的渲染和音频的渲染都是再各自不同的线程中进行的,即画面渲染用OpenGL ES,音频的渲染用的是扬声器或者听筒。所以要是不加以控制肯定错乱。

音视频同步一般分三种:音频向视频同步、视频向音频同步、音视频向外部时间钟同步。

二、原理

音视频同步一般分为三种:

第一种:音频向视频同步

视频会维持一定的刷新率,或者根据渲染视频的时长来决定当前视频帧的渲染时长。当我们播放音频的时候会与当前渲染的视频帧的时间戳进行比较,这个差值如果不在阈值(ps:预先定义好的,如果这个差值小于等于阈值就不做处理)范围内就需要做对齐操作。如果在阈值范围内就可以不做处理。

对齐原理如下:如果音频的时间戳比视频的时间戳大,就需要等待(具体的等待可以是填充空数据、也可以是将音频的速度放慢播放)。如果音频的时间戳比视频的时间戳小,那就需要机型跳帧(具体的跳帧操作可以是加快速度播放的实现,也可以是丢弃一部分音频帧的实现)。而此时视频帧是一帧一帧渲染的,一旦视频的时间戳赶上了音频的时间戳就可以填充正常的音频数据了。

优点:音频可以完全的播放,也就是用户可以完整的看到视频画面

缺点:音频帧有可能会丢失或者插入静音帧(也就是00帧)。音频有可能会加速(或者跳变)也有可能会有静音数据(或者慢速播放)

第二种:视频向音频同步

和第一种情况相反;由于不论是哪个平台上播放音频的引擎,都可以保证播放音频的时间长度和与实际这段音频所代表的时间长度是一致的,所以我们可以依赖于音频的顺序播放为我们提供的时间戳,当客户端代码请求发送视频帧的时候,会先计算当前视频队列头部的视频帧元素的时间戳与当前音频播放帧的时间戳的差值。当差值在阈值范围内就可以渲染这一帧视频;如果不在阈值范围内就需要进行对齐操作。

具体的对齐操作方法是:如果当前队列头部的视频帧的时间戳小于当前播放的音频帧的时间戳,那视频帧就进行跳帧操作;如果大于当前播放音频帧的时间戳;那就进行等待(或者重复渲染上一帧或不进行渲染)。

优点:音频可以连续的进行播放

缺点:视频画面会有跳帧操作或者重复渲染操作,但是对于视频的丢帧或者重复渲染用户的眼睛不太容易分辨出来。所以这种方式还是不错的

第三种:音视频统一向外部时间钟同步。

这种策略是以上两种策略的综合体,其实就是外部单独维护一轨外部时钟,我们要保证这个外部时钟的更新是按照时间的增加慢慢增加的,当获取音频数据和视频帧的时候,都需要和这个外部时钟进行对齐,如果没有超过阈值就直接返回音频或者视频帧,如果超过了阈值就要进行对齐操作。

具体的对齐方法是:使用上述两种方式的对齐分别应用于音频的对齐和视频的对齐。

优点:可以最大限度的保证音频和视频都不发生跳帧行为

缺点:如果控制不好外部时钟,音频和视频都有可能发生跳帧行为(视频画面&声音错乱)

 

三、总结

根据人耳朵和眼睛生理构造因素,得出一个结论,那就是人的耳朵要比眼睛敏感的多,也就是说如果音频有跳帧行为则人的耳朵很容易分辨出来,如果视频画面有跳帧行为或者重复渲染人的眼睛则不容易分辨出来。根据这理论在做视频播放器的时候可以选择的音视频对齐策略是“视频向音频对齐”。

原文链接:https://www.cnblogs.com/tony-yang-flutter/p/15544130.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/8061

(0)
上一篇 2022年10月9日
下一篇 2022年10月9日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml