2011-08-02 31 views
16

我正在爲mpeg4視頻流的自定義實現編寫一個視頻解碼器(使用FFMPEG/AVCodec)。這個視頻流的特點是,它可以分裂成許多「兒子」流,基於同一父母創建許多P幀。我試圖解碼的視頻流實際上是一種「視頻樹」。事情是這樣的:如何創建解碼器的完整副本?

I <--P <--P <---------------------P <-------------- P <------------ P 
      \ <--P <--P <--P  \ <--P <--P  \ <--P <--P 

我已經寫了,當我決定遵循一條路徑的正常工作基本解碼器,問題是,當我嘗試按照視頻中的樹不止一條路徑。此時我需要「解鎖」我的解碼器來跟蹤兩個不同的視頻流。分裂可能不僅發生在關鍵幀之後,而且甚至發生在P幀之後,所以我需要複製AVCodecContext(我使用avcodec_copy_context),但它似乎從乾淨的狀態創建新的解碼器..它似乎忽略了以前的視頻狀態,所以解碼的P幀被「應用」到空的視頻幀。 可能使用avcodec_copy_context複製上下文是不夠的...任何建議?我如何複製上下文和解碼器的完整狀態? 或者,有沒有其他的方式來解碼我的流使用引用? 謝謝!

+0

你有沒有設法找到如何做一個AVCodecContext的深層副本? – zahirdhada

回答

3

根據documentation:「生成的目標編解碼器上下文將未打開,即在使用此AVCodecContext解碼/編碼視頻/音頻數據之前,您需要調用avcodec_open()。」

所以,爲了達到你在另一個解碼器中的位置,我想你將不得不打開流並尋求相同的位置(av_seek_frame)。

或者,您可以從一開始就並行維護多個解碼器,以防需要稍後分叉。如果您只需要幾條並行路徑,這可能是一個選項。

或者您只使用一個解碼器,並在此情況下尋找,例如與DVD菜單結構,如果你只需要在任何時候顯示一個單一的路徑。

+0

我正在解碼原始直播視頻流,所以我沒有'AVFormatContext',所以'av_seek_frame()'不起作用。我也同時想到了多個解碼器,但這樣效率不高。你還有其他建議嗎?謝謝.. – zahirdhada

+0

你是指[這個用例](https://www.mail-archive.com/[email protected]/msg08024.html)?我會存儲整個流,並從一開始就爲每條路徑工作。或者我會嘗試將流重新編碼爲更友好,可搜索的格式,當我收到它時, – azt

+0

是的,那是我的用例。 – zahirdhada