为什么 ffmpeg return 与同一文件的 ffprobe 的帧数不同?

Why does ffmpeg return a different framecount than ffprobe for the same file?

我正在尝试计算视频中的帧数,但 ffmpeg 和 ffprobe 给了我两个不同的答案。

$ time ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 myvideo.mp4
2858

real    0m2.987s
user    0m2.740s
sys     0m0.172s

当我用 ffmpeg 检查同一个文件时,我又得到了 2 帧...

$ time ffmpeg -y -i myvideo.mp4 -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep 'frame=' | awk '{print }'
2860

real    0m0.127s
user    0m0.080s
sys     0m0.032s

我使用 ffprobe 输出所有帧并计算结果输出中“[FRAME]”的数量...

ffprobe -i myvideo.mp4 -show_frames -v error | grep -o '\[FRAME\]' | wc -l
2858

如您所见,它显示了 ffprobe 认为的数字。

显然我更愿意在这里使用 ffmpeg,因为它比 ffprobe 快得多,而且我正在处理数以千计的需要解析和索引的视频。然而,失败在多个视频中并不一致;有时是 1 个出局,有时是 2 个或更多...

不幸的是,过去两年我一直在使用 ffmpeg 方法计算帧数,所以我现在有一个重要的视频库要重新处理......他吞了......我想这是验证的好方法集群上文件的可读性...即便如此,重新计算所有现有视频帧大小可能需要几周时间。

是的,Mulvya 是正确的。通过使用 FFprobe 查询 nb_frames,我能够获得一致的数字。默认情况下,ffprobe 使用 -count_frames,它从字面上从文件顶部开始计算帧数,一直到文件底部。当然,这是一个相当慢的操作,特别是如果视频文件很大(我的往往是这样)。

time ./ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 big.mp4
real    1m4.531s
user    0m7.172s
sys     0m0.104s

FFmpeg 写入 stsz 框,当(在我的例子中)从另一种格式转换时,它认为文件中的帧数。所以,我选择使用stsz中的值,因为虽然不正确,但是是一致的,而且查询起来非常快

time ffprobe -v quiet -pretty  -select_streams v:0 -show_entries "stream=nb_frames" big.mp4
real    0m0.023s
user    0m0.040s
sys     0m0.008s

谢谢 Mulvya!