2011-08-02 33 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