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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么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方法计算了过去两年的帧数,所以我现在有一个重要的视频库来重新处理...他吞咽了...我想这是一个很好的方法来验证文件的可读性集群......即便如此,它可能需要几周时间才能重新计算所有现有的视频帧大小。

答案

是的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?的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg4 代码输出mp4文件帧数

ffmpeg4 代码输出mp4文件帧数

什么软件可以把一段电影视频的每一帧连续自动保存成图片,同时显示每张图片的帧数信息?

ffmpeg 分析一个视频的基本结构组成_流_包_帧

FLASH动画的帧数与时间问题

Cocos2D SpriteSheet动画问题,我的帧数要大很多