使用 ffprobe/ffmpeg 按编码顺序提取单个帧和类型

Using ffprobe/ffmpeg to extract individual frames and types in encode order

我可以使用 ffmpeg 提取关键帧。我一直在使用这样的东西:

ffmpeg -i input.mp4 -vf "select='eq(pict_type\,I)" -vsync vfr -qscale:v 2 I-thumbnails-%02d.png -vf "select='eq(pict_type\,B)" -vsync vfr -qscale:v 2 B-thumbnails-%02d.png -vf "select='eq(pict_type\,P)" -vsync vfr -qscale:v 2 P-thumbnails-%02d.png

现在的问题是,我希望这些提取的帧按编码顺序排列,如果可能的话,提取它们的方式应该有时间戳或任何方式来知道它们以特定顺序开始,例如,从从头到尾:

IBBBIPPB......BI

但在某种程度上,我可以对编码序列中的帧进行排序。

我想用它加载 python 来提取运动矢量,但它们都应该遵循编码顺序。有帮助吗?

编辑: 将播放更改为编码序列(或顺序)。

使用最新版本的 ffmpeg,您可以运行、

ffmpeg -i input.mp4
  -vf "select='eq(pict_type\,I)" -vsync 0 -frame_pts 1 thumbnails-%02d-I.png
  -vf "select='eq(pict_type\,B)" -vsync 0 -frame_pts 1 thumbnails-%02d-B.png
  -vf "select='eq(pict_type\,P)" -vsync 0 -frame_pts 1 thumbnails-%02d-P.png

图像序列号将对应于它们在视频中的索引位置(显示方式),后缀将指示帧类型。


要按 encode/decode 顺序获取帧,运行

ffmpeg -i input.mp4
  -vf "setpts=POS,select='eq(pict_type\,I)" -vsync 0 -frame_pts 1 thumbnails-%09d-I.png
  -vf "setpts=POS,select='eq(pict_type\,B)" -vsync 0 -frame_pts 1 thumbnails-%09d-B.png
  -vf "setpts=POS,select='eq(pict_type\,P)" -vsync 0 -frame_pts 1 thumbnails-%09d-P.png

您应该按 alphabetical/lexical 顺序对输出图像列表进行排序 - 即 encode/decode 顺序的图像。如果需要,您可以将 9 位字段批量重命名为简单的序列索引。

setpts=POS 将帧的时间戳设置为其在文件中的字节偏移量,这将跟踪 encode/decode 顺序。