2013-02-19 107 views
1

應該如何在ffmpeg中調用avcodec_close?使用avcodec_close的ffmpeg問題

這是再現我的問題最簡單的代碼:

bool CDataSequenceFormat::openVideoCodec(AVStream* videoStream) 
{ 
    AVCodecContext* codecContext = videoStream->codec; 

    AVCodec* codec = avcodec_find_encoder(codecContext->codec_id); 

    if (codec == NULL || avcodec_open2(codecContext, codec, NULL) < 0 || avcodec_is_open(codecContext)==0) 
    { 
     return false; 
    } 

    avcodec_close(codecContext); 

    return true; 
} 

avcodec_open2不會返回一個錯誤,avcodec_is_open返回1,所以我假設codecContext已正確設置。我認爲這是錯誤的嗎?

當我後,立即打電話avcodec_close,我得到一個訪問衝突異常(寫入badf00d - 但我認爲avcodec_open2處理中的所有編解碼器領域的填充)在avcodec中-54.dll

人們似乎某處當嘗試在未打開的編解碼器上調用avcodec_close時出現分段錯誤,但我不認爲這是這種情況。

任何想法我做錯了嗎?

編輯:我應該提到,我繼承了這個代碼用一個相當老版本的ffmpeg而這個問題只有當我更新到最新的ffmpeg的壓縮包

回答

2

我使用output_example.c改寫了類出現例如,它似乎神奇地解決了這個問題。

在進一步的調查,似乎問題是的av_set_parametersav_write_headeravcodec_open2的順序。以前版本的ffmpeg似乎並不在意avcodec_openav_set_parameters之後被調用,但實際上並沒有填充最新版本中的所有編解碼器字段,除非它被首先調用