在ffmpeg 2.5.1版本下编译ffmpeg-tutorial,发现所有与音频相关的tutorial都有噪声,而ffplay却能完美播放。问度娘谷歌无果,只好看ffplay的代码。对ffplay.c代码结构不熟悉的可以戳这里点击打开链接
在ffplay.c中,有三个与audio有关的重要函数,分别是read_thread、decoder_decode_frame、audio_decode_frame。read_thread负责从文件或流中读取数据,decoder_decode_frame则把read_thread读取到的数据解码,audio_decode_frame从名字上看好像也是在做解码的工作,实际上在ffplay.c中它只是做了格式转换,解码的工作在decoder_decode_frame做了。
对比ffplay.c和tutorial05.c两个文件中处理音频的代码,从数据获取到解码,两者基本都是一致的,唯一的差别就在audio_decode_frame。其中有一行比较关键的代码
len2 = swr_convert(is->swr_ctx, out, out_count, in, is->audio_frame.nb_samples);
swr_convert这个函数应该是swresample中的,对音频进行重采样。既然我们找到了两份代码的不同点,只要把tutorial05.c中缺少的那部分补上去应该就没问题了。在这里只贴出audio_decode_frame函数的代码:
int audio_decode_frame(VideoState *is, double *pts_ptr) {
int len1, data_size = 0, n, resampled_data_size;
int64_t dec_channel_layout;
int wanted_nb_samples;
AVPacket *pkt = &is->audio_pkt;
double pts;
AVFrame *frame;
for(;;) {
while(is->audio_pkt_size > 0) {
int got_frame;
len1 = avcodec_decode_audio4(is->audio_st->codec, &is->audio_frame, &got_fram