15

我正在为 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是不够的......有什么建议吗?如何复制解码器的上下文和完整状态?或者,有没有其他方法可以使用引用解码我的流?谢谢!

4

1 回答 1

3

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

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

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

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

于 2015-04-28T08:44:33.420 回答