为什么ffmpeg为同一个文件返回的帧数不同于ffprobe?

时间:2018-02-26 22:09:56

标签: ffmpeg ffprobe

我正在尝试计算视频中的帧数,但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 $2}'
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方法计算了过去两年的帧数,所以我现在有一个重要的视频库可以重新处理...他吞咽了...我想这是一个验证可读性的好方法集群上的文件......即便如此,重新计算所有现有的视频帧大小也需要几周的时间。

1 个答案:

答案 0 :(得分:0)

是的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!