FFMPEG 提取帧内 I、P、B 帧

FFMPEG 提取帧内 I、P、B 帧

有没有办法从 FFMPEG 或类似程序中提取帧内帧并按原样保存它们?我知道您可以使用将帧提取到 JPEG 图像序列中-f image2。但那些是每个帧的完整图像。我只想导出运动变化的图像,所以我会让 P 帧和 B 帧仅显示运动变化,排除或屏蔽图像的未变化区域。

这可能吗?

我正在使用的基本帧导出命令。这将以指定的 FPS 为我提供每帧的完整图像。

ffmpeg -i input.mp4 -r 12 -an -b 1024k -y -f image2 frame%4d.jpg

我希望导出这些帧,这样我就有了一个帧文件夹,其中第一帧是完整图像,下一帧只是需要重新绘制图像的图像数据。暴露两帧之间的时间冗余(这难道不是 I、P、B 帧的作用吗?)

答案1

要提取特定类型的框架,请使用select筛选

select=eq(pict_type\,<x>)

其中是<x>下列之一:pict_type (video only) the type of the filtered frame, can assume one of the following values: I, P, B, S, SI, SP, BI

例如:

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B)[out]' b.frames.mp4

要了解有关输出的更多信息,请添加showinfo筛选

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B),showinfo[out]' b.frames.mp4

答案2

P 帧和 B 帧通常不包含每个已更改区域的新图像数据。相反,图片被分解为不同类型的宏块。某些类型的宏块包含新图像数据,但大多数宏块根据其他参考图片和运动矢量计算内容。

这并不完全是您想要的,但是这将使用颜色来显示每个宏块的类型:

ffmpeg -debug vis_mb_type -i input.mp4 output.mp4

或者

ffplay -debug vis_mb_type input.mp4

这还将向您显示运动矢量:

ffplay -debug vis_mb_type -vismv 7 input.mp4

有关每个 MB 颜色的更多信息,请参阅链接:

调试宏块和运动矢量 FFMpeg 文档

相关内容