【问题标题】:How can I create a FULL copy of a decoder?如何创建解码器的完整副本?
【发布时间】:2011-10-18 08:38:44
【问题描述】:

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

【问题讨论】:

  • 你有没有设法找到如何制作 AVCodecContext 的深层副本?

标签: ffmpeg libavcodec mpeg-4 avcodec


【解决方案1】:

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

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

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

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

【讨论】:

  • 我正在解码一个原始的直播流,所以我没有AVFormatContext,所以av_seek_frame() 不起作用。我也曾考虑并行使用多个解码器,但这样做效率低下。你还有其他建议吗?谢谢..
  • 你指的是this use case吗?我要么存储整个流并从一开始就为每条路径工作。或者我会尝试将流重新编码为更友好、更易于搜索的格式,当我收到它时,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多