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

dam*_*olo 15 ffmpeg mpeg-4 libavcodec avcodec

我正在编写一个视频解码器(使用FFMPEG/AVCodec)来自定义实现mpeg4视频流.这个视频流的特点是它可以分成许多"子"流,根据同一个父节点创建许多P帧.我正在尝试解码的视频流实际上是一种"视频树".像这样的东西:

I <--P <--P <---------------------P <-------------- P <------------ P
           \ <--P <--P <--P        \ <--P <--P       \ <--P <--P 
Run Code Online (Sandbox Code Playgroud)

我已经写了一个基本的解码器,当我决定遵循一条路径时工作正常,问题是当我尝试在视频树中跟随多个路径时.此时我需要"解析"我的解码器以跟随两个不同的视频流.拆分不仅可能发生在关键帧之后,甚至在P帧之后,所以我需要复制AVCodecContext(我使用avcodec_copy_context)但它似乎从干净的状态创建新的解码器..它似乎忽略了以前的视频状态因此,解码的P帧被"应用"到空视频帧.可能复制上下文使用avcodec_copy_context是不够的...任何建议?如何复制上下文和解码器的完整状态?或者,有没有其他方法使用引用解码我的流?谢谢!

azt*_*azt 3

根据文档:“生成的目标编解码器上下文将未打开,即您需要先调用 avcodec_open(),然后才能使用此 AVCodecContext 来解码/编码视频/音频数据。”

因此,为了到达您在另一个解码器中的位置,我想您必须打开流并寻找相同的位置(av_seek_frame)。

或者,您可以从一开始就并行维护多个解码器,以防以后需要分叉。如果您只需要并行的几个路径,这可能是一个选项。

或者,如果您只需要随时显示单个路径,则您仅使用单个解码器,并在这种情况下四处寻找,例如使用 DVD 菜单结构。