【问题标题】:MPEG backwards frame decoding using FFmpeg使用 FFmpeg 的 MPEG 反向帧解码
【发布时间】:2012-03-12 14:59:43
【问题描述】:

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

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

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

  2. 我不能只获取我的第一个“I”帧,然后将其传递给 ffmpeg 的“avcodec_decode_video”函数,然后才将我的最后一个“P”帧传递给 ffmpeg,因为最后一个“P”帧取决于前面的“P”帧吧? (嗯..据我测试过这种方法,我最后解码的 P 帧有伪影)

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

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

谢谢

【问题讨论】:

  • 我现在以 JPEG 格式存储所有解码的“块”帧,这极大地节省了内存,但仍然......最后,我的输出格式需要是 RGB(执行播放时)所以现在我还需要执行JPEG到RGB的转换......仍然......感觉这不是正确的选择(将所有图像存储在内存中)

标签: c++ ffmpeg decoding mpeg


【解决方案1】:

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

  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.

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

但是,这非常复杂,我见过很少有软件可以实际做到这一点。

【讨论】:

    【解决方案2】:

    我认为没有办法从 I 帧开始解码所有 P 帧,因为 P 帧取决于前一帧。为了处理解码的帧,可以将它们保存到文件中,或者,由于存储空间和额外的 CPU 能力有限,旧的 P 帧可以被丢弃并在以后重新计算。

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

    ffmpeg -i input_video output%4d.jpg
    

    然后以某种方式颠倒它们的顺序并转换回视频:

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

    如果可以的话,您可以考虑进行预处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2013-02-06
      • 2017-04-23
      • 1970-01-01
      • 2018-01-15
      • 2016-10-24
      • 2013-08-28
      相关资源
      最近更新 更多