2016-02-02 14 views
0

我想知道如何從ALAC媒體文件中使用FFmpeg庫獲得extradata而無需手動解析文件?FFmpeg - 如何獲取打開ALAC編解碼器所需的額外數據?

我設置最初:

avformat_open_input(&formatContext, pszFileName, 0, 0); 
avformat_find_stream_info(formatContext, NULL); 
av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, &codec, 0); 
codecContext = avcodec_alloc_context3(codec); 

目前我能夠檢測並發現ALAC編解碼器,但它無法打開該編解碼器返回AVERROR_INVALIDDATA,這是從而額外extradata_size不是組。

avcodec_open2(codecContext, codec, NULL); 

FFmpeg的文件指出,一些編解碼器需要而額外extradata_size設置爲編解碼器的規格。但是不應該由設置這個數據avformat_find_stream_info

回答

2

是,extradataavformat_open_input()avformat_find_stream_info()期間填充。但是,它會將其填充到您未使用的字段中。你需要下面的代碼:

avformat_open_input(&formatContext, pszFileName, 0, 0); 
avformat_find_stream_info(formatContext, NULL); 
int audioStreamIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, &codec, 0); 
codecContext = avcodec_alloc_context3(codec); 
avcodec_copy_context(codecContext, formatContext->streams[audioStreamIndex]->codec); 
avcodec_open2(codecContext, codec, NULL); 

相關的額外線是avcodec_copy_context(),從libavformat分路器將數據複製(在formatContext->streams[])到上下文(codecContext),您將用於使用解碼器解碼的副本在libavcodec

+0

謝謝,我現在可以打開的編解碼器,但在解碼時獲得: V/FFMPEG:33 4096無效零塊大小4065 V/FFMPEG:未知預測類型:3 V/FFMPEG:無效零塊大小26 4096 4094 V/FFMPEG:不支持的語法元素:5. 可能的原因? – Sowry

+0

你能發佈完整的代碼和一個示例輸入文件嗎? –

+0

管理修復它。實施中再一次出現了問題。在使用avcodec_decode_audio4解碼之前,我沒有調用** av_read_frame(formatContext,&packet)**。 – Sowry

相關問題