为什么 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!
我正在尝试计算视频中的帧数,但 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!