使用FFmpeg的MPEG后向帧解码
MPEG backwards frame decoding using FFmpeg
我有所谓的"块",它存储一些MPEG4(I,p,p,p…)帧。对于每个"块",帧从一个"I"帧开始,在下一个"我"帧之前结束。(VOL-"visual_object_sequence_start_code"始终包含在"I"帧之前)
我需要能够在"向后"模式下播放那些"块"帧。厚度是:
-
不可能只取块中的最后一帧并执行解码,因为这是一个"p"帧,需要一个"帧间(I)"才能正确解码。
-
我不能只取我的第一个"I"帧,然后将其传递给ffmpeg的"avcodec_decode_video"函数,然后再将我的最后一个"p"帧传递给ffpeg,因为最后一个"p"帧取决于它之前的"p"框,对吧?(嗯……就我测试过的方法而言,我最后一个解码的P帧有伪影)
现在我执行反向播放的方式是——首先用RGB解码我的所有"块"帧,并将它们存储在内存中。(在大多数情况下,每个块最多25帧)但这种方法确实需要大量内存。。。(尤其是在帧分辨率较高的情况下)我有一种感觉,这不是正确的方式。。。
所以我想问,有人对如何使用FFmpeg执行这种"向后"帧解码/播放有任何建议吗?
感谢
您真正关注的是一个研究问题:要了解整体方法,请查看以下论文:
-
MPEG视频流的压缩域反向播放,SPIE国际语音、视频和数据通信研讨会,马萨诸塞州波士顿,1998年11月。
-
MPEG视频流的反向播放算法
-
利用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
如果可以的话,您可以考虑预处理。
- 无法解码base64+deflate数据
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 使用已使用 java 编码的 openssl 解码数据
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 从原始字节解码协议缓冲区(以 C++为单位)
- FFmpeg——使用硬件加速进行视频解码
- 如何从WIC解码器确定自上而下/自下而上?
- 使用公钥加密消息:BER 解码错误
- 在CRC-16 CCITT中将数据从二进制解码为文本,我应该输入一个码字,使用CRC生成器进行编码
- 在 GLFW 窗口中显示 FFMPEG 解码帧
- 如何将 MJPEG 解码为原始 RGB(或 YUV)数据
- 编译时 Base64 解码 C++
- 解码H264流时如何跳过帧?
- 无法在 HEVC 解码器上设置输出类型 IMFTransform
- pyserial arduino 字节阵列解码问题
- 将帧从 h264 流解码到 OpenCV Mat
- 连接无线电流和 MP3 解码器
- FFMPEG API:将MPEG解码为YUV帧并更改这些帧
- 使用FFmpeg的MPEG后向帧解码