为什么需要音视频同步?
从前面的代码可以看到,播放的过程有解码线程不断的把解码好的AVFrame数据放入队列,然后播放线程从队列中取出解码后的数据,经过格式转换,分别送给ANativeWindow去绘制,送给OpenSlES去播放声音,这个过程如果不去控制,播放的速度就取决与解码线程,播放线程的处理速度,及系统的性能.这样播放的效果,肯定是不流畅的.
为了让播放尽可能流畅,就要把视频播放的帧率考虑进来,比如希望fps是30,那么就在绘制时的间隔控制在1/30.
加入绘制间隔的控制,虽然视频播放比流畅了,但是画面跟音频没有保持一致.音频与视频各播各的,由于机器运行速度,解码效率等种种造成时间差异的因素影响,即使最初音视频是基本同步的,也会随着时间的流逝逐渐失去同步。所以,必须要采用一定的同步策略,不断对音视频的时间差作校正,使图像显示与声音播放总体保持一致。所以需要做音视频的同步.
音视频的同步,有三种方式:
1、参考一个外部时钟,将音频与视频同步至此时间;
2、以视频为基准,音频去同步视频的时间;
3、以音频为基准,视频去同步音频的时间。
由于人对声音的变化相对于视觉更加敏感。所以频繁的去调整声音的播放会感觉刺耳或杂音影响用户体验。所以一般情况下,播放器使用第三种同步方式。
在音视频同步的处理中,有一个音视频时钟的概念,通过AVFrame->pts来获取,所以先说下PTS想关几个概念:
视频中的I P B帧:
I 帧:帧内编码帧 ,一个图像经过压缩后的产物,包含一幅完整的图像信息;
P 帧: 前向预测编码帧,利用之前的I帧或P帧进行预测编码
B 帧: 双向预测内插编码帧 ,利用之前和之后的I帧或P帧进行双向预测编码。
IDR帧:一个序列的第一个图像叫做IDR帧