使用FFmpeg的MPEG后向帧解码

MPEG backwards frame decoding using FFmpeg

本文关键字:解码 MPEG FFmpeg 使用      更新时间:2023-10-16

我有所谓的"块",它存储一些MPEG4(I,p,p,p…)帧。对于每个"块",帧从一个"I"帧开始,在下一个"我"帧之前结束。(VOL-"visual_object_sequence_start_code"始终包含在"I"帧之前)

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

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

  2. 我不能只取我的第一个"I"帧,然后将其传递给ffmpeg的"avcodec_decode_video"函数,然后再将我的最后一个"p"帧传递给ffpeg,因为最后一个"p"帧取决于它之前的"p"框,对吧?(嗯……就我测试过的方法而言,我最后一个解码的P帧有伪影)

现在我执行反向播放的方式是——首先用RGB解码我的所有"块"帧,并将它们存储在内存中。(在大多数情况下,每个块最多25帧)但这种方法确实需要大量内存。。。(尤其是在帧分辨率较高的情况下)我有一种感觉,这不是正确的方式。。。

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

感谢

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

  1. MPEG视频流的压缩域反向播放,SPIE国际语音、视频和数据通信研讨会,马萨诸塞州波士顿,1998年11月。

  2. MPEG视频流的反向播放算法

  3. 利用MPEG视频压缩域处理应用程序处理压缩视频数据中的时间相关性。

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

然而,这是非常复杂的,我看到了罕见的软件在实践中这样做。

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

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

ffmpeg -i input_video output%4d.jpg

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

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

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