我正在编写视频解码器(使用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
复制上下文是不够的......有什么建议吗?如何复制上下文和解码器的完整状态?
或者,有没有其他方法使用引用解码我的流?
谢谢!
答案 0 :(得分:3)
根据documentation:“生成的目标编解码器上下文将是未打开的,即您需要先调用avcodec_open()才能使用此AVCodecContext对视频/音频数据进行解码/编码。”
因此,为了达到您在其他解码器中的位置,我猜您必须打开流并寻找相同的位置(av_seek_frame)。
或者,您可以从头开始并行维护多个解码器,以防您需要稍后进行分叉。如果您只需要并行使用几个路径,这可能是一个选项。
或者你只使用一个解码器,并在这种情况下寻找,例如如果您只需要随时显示单个路径,则使用DVD菜单结构。