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

使用ffmpeg获取特定帧的帧类型,ffmpeg,x264,ffprobe,Ffmpeg,X264,Ffprobe,我需要获取x264编码电影的特定帧号的帧类型(I/B/p) 如何使用ffmpeg/ffprobe实现这一点? 我对其他解决方案也持开放态度。我找到了使用ffprobe和grep的方法: $ 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

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

如何使用ffmpeg/ffprobe实现这一点?
我对其他解决方案也持开放态度。

我找到了使用
ffprobe
grep
的方法:

$ 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)的帧类型,您可以将其扩展到:

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

pict_type=P
coded_picture_number=8

您可以直接使用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。请注意,您需要的是
显示图片编号
,而不是编码。

也许您可以使用
-debug vis_mb_type
。这将把nal单元类型打印到stdoutI尝试运行的
ffplay video.mp4-vf showinfo
,这将把所有pic类型打印到屏幕上。之前的命令只对hevc起作用,这对我起作用了,谢谢。最后我使用了以下命令:
ffmpeg-I input.mkv-vf“select=eq(n\,100),showinfo-f null-2>&1 | grep type:| awk'{split($16,a,“:”);打印[2]}'