使用FFmpeg进行MPEG后向帧解码

时间:2012-02-22 09:28:40

标签: c++ ffmpeg decoding mpeg

我有所谓的“块”,它存储了一些MPEG4(I,p,p,p,p ......)帧。 对于每个“块”,帧以“I”帧开始,并在下一个“I”帧之前结束。 (VOL - “visual_object_sequence_start_code”总是包含在“I”帧之前)

我需要能够以“向后”模式播放这些“块”帧。 厚厚的是:

  1. 不可能只占用我的块中的最后一帧并执行解码,因为它是一个“P”帧,需要“帧间(I)”才能正确解码。

    < / LI>
  2. 我不能只拍摄我的第一个“I”帧,然后将其传递给ffmpeg的“avcodec_decode_video”函数,然后将最后一个“P”帧传递给ffmpeg,因为最后一个“P”帧取决于之前的“P”框架,对吧? (好吧......据我测试过这种方法,我上次解码的P帧有伪影)

  3. 现在我正在向后播放的方式是 - 首先解码RGB中的所有“块”帧并将它们存储在内存中。 (在大多数情况下,每块最大约为25帧。)但这种方法确实需要大量内存......(特别是如果帧分辨率很高) 我觉得这不是正确的做法......

    所以我想问一下,有没有人建议如何使用FFmpeg执行这种“向后”帧解码/播放?

    由于

2 个答案:

答案 0 :(得分:3)

您正在研究的是一个真正的研究问题:要了解整体方法,请查看以下文章:

  1. Compressed-Domain Reverse Play of MPEG Video Streams, SPIE International Symposium on Voice, Video, and Data Communications, Boston, MA, November, 1998.

  2. Reverse-play algorithm for MPEG video streaming

  3. MANIPULATING TEMPORAL DEPENDENCIES IN COMPRESSED VIDEO DATA WITH APPLICATIONS TO COMPRESSED-DOMAIN PROCESSING OF MPEG VIDEO.

  4. 基本上,仍然存在基于关键帧的高级编码,但是,您可以反转运动补偿的过程以实现反向流动。这是通过将P帧即时转换为I帧来完成的。这确实需要向前看,但不需要更多的内存。可能您可以将其保存为新文件,然后将其应用于具有反向播放要求的标准解码器。

    然而,这非常复杂,我见过很少见的软件实际上这样做。

答案 1 :(得分:1)

由于P帧取决于前一帧,我认为从I帧开始并解码所有P帧没有办法解决问题。要处理已解码的帧,可以将它们保存到文件中,或者,如果存储空间有限并且CPU功率有限,则可以丢弃较旧的P帧并在以后重新计算。

在命令级别,您可以将输入视频转换为一系列图像:

ffmpeg -i input_video output%4d.jpg

然后以某种方式撤销他们的订单并转换回视频:

ffmpeg -r FRAME_RATE -i reverse_output%4d.jpg output_video

如果是选项,您可以考虑进行预处理。