如何创建解码器的完整副本?

15

我正在编写一个视频解码器(使用FFMPEG/AVCodec)来解码自定义实现的MPEG4视频流。这个视频流的特殊之处在于它可以分成许多“子”流,基于同一个父流创建许多P帧。我正在尝试解码的视频流实际上是一种“视频树”。类似这样:

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

我已经写了一个基本的解码器,当我决定跟随一条路径时它可以正常工作,但是当我尝试在视频树中跟随多条路径时就会出现问题。此时我需要“分叉”我的解码器以跟随两个不同的视频流。这种分叉可能发生在关键帧之后,甚至在P帧之后,因此我需要复制AVCodecContext(我使用avcodec_copy_context),但它似乎会创建一个新的从零开始的解码器...它似乎会忽略先前的视频状态,所以解码的P帧被“应用”到一个空白的视频帧上。 也许仅仅使用avcodec_copy_context来复制上下文不够用...有什么建议吗?我如何复制解码器的上下文和完整状态? 或者,是否有其他方法可以使用引用解码我的流? 谢谢!


你是否曾经找到如何制作AVCodecContext的深度复制? - zahirdhada
1个回答

3
根据文档,生成的目标编解码器上下文将未打开,即在使用此AVCodecContext解码/编码视频/音频数据之前,需要调用avcodec_open()打开。
因此,为了到达您在另一个解码器中的位置,我猜您需要打开流并寻找到相同的位置 (av_seek_frame)。
或者,您可以从一开始就并行使用多个解码器,以防稍后需要拆分。如果您只需要并行处理少数路径,则这可能是一种选择。
或者您只使用单个解码器,并在此实例中进行寻找,例如DVD菜单结构,如果您只需要随时显示单个路径。

我正在解码一个原始的实时流,所以我没有AVFormatContext,因此av_seek_frame()无法使用。我也考虑过并行使用多个解码器,但那样会很低效。你有其他的想法吗?谢谢。 - zahirdhada
你是指的这个使用案例吗?我会将整个流存储起来,并从开头处理每个路径。或者,当我接收到流时,我会尝试重新编码成更友好、可寻址的格式。 - azt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接