事實上,在 Audio 上花了不少時間,主要是因為測試用的檔案,Video 和 Audio 有不同的格式,我只是想先用最單純的方法來實作這個練習,所以使用的是 Video (H.264) + Audio (AAC) 的測試檔,但是在網路上下載的不一定就剛好是這樣的組合,格式一不對,很容易就會出現問題,所以一定要小心格式的問題。另外,也可以參考 ffplay.c 這個檔案,雖然複雜了點,但先找到你想知道的部份,還是可以把範圍縮小。
加入 Audio 我認為最主要的部份就是怎麼去解碼 Audio frame ,以下就列出修改後的程式:
for(;;) { while(avpkt.size > 0) { if (!decoded_frame) { if (!(decoded_frame = avcodec_alloc_frame())) return AVERROR(ENOMEM); } else avcodec_get_frame_defaults(decoded_frame); len = avcodec_decode_audio4(aCodecCtx, decoded_frame, &got_frame, &avpkt); if(len < 0) { /* if error, skip frame */ avpkt.size = 0; break; } avpkt.data += len; avpkt.size -= len; if (!got_frame) { continue; } data_size = av_samples_get_buffer_size(NULL, aCodecCtx->channels, decoded_frame->nb_samples, aCodecCtx->sample_fmt, 1); memmove(audio_buf, decoded_frame->data[0], data_size); /* We have data, return it and come back for more later */ return data_size; } if(quit) { return -1; } if(packet_queue_get(&audioq, &avpkt, 1) < 0) { return -1; } }
在這裡還想說一件事,那就是有觀念程式才知道怎麼寫。有時候你看不懂某一段程式,一定是有什麼觀念你還不知道,你才會看不懂。
沒有留言:
張貼留言