在上一篇“视频同步音频”的策略中,是通过丢帧或重复显示的方法来达到追赶或等待音频时钟的目的,但在“音频同步视频”时,却不能这样简单处理。 音频在输出时,最小单位是“样本”。音频一般以数字采样值保存,一般常用的采样频率有44.1K,48K等,也就是每秒钟有44100或48000个样本。视频输出显示与“样本”概念最为接近的画面帧,如一个24fps的视频,一秒钟有24个画面输出,这里的一个画面和音频中的一个样本是等效的。如果对音频使用一样的丢帧(丢样本)和重复显示方案,是不科学的,音频的连续性远高于视频,通过重复几百个样本或者丢弃几百个样本来达到同步,会在听觉有很明显的不连贯。 来看看音频解码的代码:
//为了方便阅读,以下代码经过简化,只保留音视频同步相关代码
static int audio_decode_frame(VideoState *is)
{
//1. 根据与vidoe clock的差值,计算应该输出的样本数
wanted_nb_samples