音频与视频在播放当中可能会由于种种原因(如:音视频并非在同一时间开始播放,或视频由于解码任务繁重导致输出图像延迟等)导致音频与视频的播放时间出现偏差,这种就是音视频的同步问题,本文会对音视频同步进行讨论。
有三种音视频同步方式:
- 视频同步到音频时钟(synchronize video to audio clock)
- 音频同步到视频时钟(synchronize audio to video clock)
- 音视频同步到外部时钟(synchronize audio and video to external clock)
常见的实现方式是把视频同步到音频时钟。主要原因是,对于延迟以及卡顿,人的听觉较视觉更为敏感,需要尽量保持音频顺畅输出。
时钟
我们前面提到视频时钟、音频时钟指的是连续的时间。视频文件内存储的视频以及音频的时间戳都是离散的,不过如果我们假设视频与音频分别都有一个独立的时钟,各帧的时间戳代表的就是时钟上的某一时刻。如果在某一时刻,此时音频时钟与视频时钟上的刻度相同,则表明此时的音视频是完全同步的。
为了得到音频或者视频的时钟,我们可以在音频或者视频输出时记录输出帧的$pts$以及此时的系统时间$CLK_{put}$,然后在进行时钟比较时取出上次输出时的$pts$以及$CLK_{put}$,并获取当前的系统时间$CLK_{get}$,最后执行以下运算就能得到音频或者视频时钟。
$CLK = pts + CLK_{get} – CLK_{put}$
延迟
实际上音视频之间总会存在延迟,如果在某一时刻,视频时钟的刻度大于音频时钟的刻度,则表明视频比音频播放早了,或者说音频延迟了。
反之,如果在某一时刻,音频时钟的刻度大于视频时钟的刻度,则表明音频比视频播放早了,或者说视频延迟了。
可接受的延迟范围
人对延迟的敏感度并不会很高,对于通常的视频帧率来说(24fps或者30fps,即延迟在40ms之内),一帧的延迟是人类不容易察觉,即可接受的延迟范围。因此,如果音频以及视频的时钟差值在此范围内,则不用特地进行调整。
延迟调整
如果音频时钟与视频时钟之间的延迟超出可接受的范围,则需要进行时钟的调整,时钟调整主要是通过改变某一帧的播放时间来实现的,实现的方法也有多种。如果视频延迟了,则可以加快视频帧的播放速度:一解码完成,判断视频延迟,立即开始输出图像;或者直接跳过那些pts不在可接受范围内的帧。如果音频延迟了,则可以延迟视频的播放速度,或者先暂停输出后面的视频帧直到音频追上。