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