使用ffmpeg获取特定帧的帧类型

6

我需要获取x264编码电影中特定帧号的帧类型(I/B/P)。

请问如何使用ffmpeg/ffprobe实现此功能?也欢迎提供其他解决方案。


也许你可以使用“-debug vis_mb_type”命令。这将把NAL单元类型打印到标准输出。 - Dimitri Podborski
我尝试运行 ffplay video.mp4 -vf showinfo,这会将所有图片类型打印到屏幕上。之前的命令只对hevc有效,原因不明。 - Dimitri Podborski
2个回答

9
我找到了一种使用ffprobegrep的方法来完成它:
$ ffprobe video.mp4 -show_frames | grep -E 'pict_type|coded_picture_number'

这将产生以下输出结果:
pict_type=I
coded_picture_number=0
pict_type=B
coded_picture_number=3
pict_type=B
coded_picture_number=2
pict_type=P
coded_picture_number=1
pict_type=B
coded_picture_number=6
...

为了获取特定帧(例如第8帧)的帧类型,您可以扩展它如下所示:

获取特定帧的帧类型(例如第8帧),您可以将其扩展为如下内容:

$ ffprobe video.mp4 -show_frames | grep -w -E 'coded_picture_number=8' -B 1

pict_type=P
coded_picture_number=8

为什么帧的顺序不连续。它们是否没有按照ffprobe的顺序读取或者它们没有按照顺序编码。输出是实际的帧顺序还是编码图片编号? - secondplace
对于Windows用户,您可以使用以下命令:ffprobe video.mp4 -show_frames | findstr "pict_type" - Roovy

4
你可以直接使用FFmpeg。
ffmpeg -i input.mp4 -vf select='eq(n,334)',showinfo -f null -

以上代码将输出视频的第335帧。
n: 0 pts: 171008 pts_time:11.1333 pos:  1090471 fmt:yuv420p sar:1/1 s:1280x720 i:P iskey:0 type:B checksum:A72D197D plane_checksum:[9008E835 680AC49A 6CD66C90] mean:[136 122 134] stdev:[65.4 7.0 9.5]

你可以跳过选择过滤器并获得所有帧的输出,然后像@incBrain一样使用grep进行筛选。请注意,你需要的是“显示图片号”而不是编码。

这对我有用,谢谢。最终我使用了以下命令: ffmpeg -i input.mkv -vf "select=eq(n\,100),showinfo -f null - 2>&1 | grep type: | awk '{split($16,a,":"); print a[2]}' - Damnesia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接