音频播放是一个被动的过程,声卡设备主动向程序要数据,而不是程序主动发数据到声卡。在ffmpeg解码一个AVPacket的音频到AVFrame后,在AVFrame中存储的音频数据大小与SDL回调所需要的数据大概率是不相等的,这就需要再增加一级缓冲区解决问题。
在audio输出时,主要模型如下图: 在这个模型中,sdl通过sdl_audio_callback函数向ffplay要音频数据,ffplay将sampq中的数据通过
audio_decode_frame
函数取出,放入is->audio_buf
,然后送出给sdl。在后续回调时先找audio_buf
要数据,数据不足的情况下,再调用audio_decode_frame
补充audio_buf
注意audio_decode_frame
这个函数名很具有迷惑性,实际上,这个函数是没有解码功能的!这个函数主要是处理sampq到audio_buf的过程,最多只是执行了重采样。
关于SDL的音频采样,播放可以看看本专栏前面的博客,了解了大致的audio输出模型后,再看详细代码。