You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在将视频导出为图片时获取准确的帧数?

如何在将视频导出为图片时获取准确的帧数?

嘿,我来帮你拆解这个帧数不一致的问题,以及对应的解决办法:

先搞懂为什么帧数对不上

你的问题核心在于标注工具和ffmpeg的计算逻辑完全不同

  • 标注工具是用「视频总时长 × 设定的固定帧率(25fps)」倒推帧数,也就是600.12秒 ×25 =15003帧,这是理想状态下的固定帧率假设。
  • 但你的原视频根本不是标准25fps的固定帧率视频!从ffmpeg的输出能看到,视频实际是**变帧率(VFR)**的:实际播放帧率是21.82fps,参考帧率(tbr)是23.98。这时候直接用-vf fps=25导出,ffmpeg会从原视频的真实帧里按25fps间隔采样,自然和标注工具的理论帧数对不上。

两种解决方案,按需选择

方案1:和标注工具的15003帧完全对齐(强制生成理论帧数)

如果你必须拿到和标注工具一致的15003帧,不管原视频真实帧率,就用这个命令:

ffmpeg -i src/in.mp4 -r 25 -f image2 tmp/frame_%05d.jpg
  • 重点:用-r 25而非-vf fps=25-r 25是强制输出帧率为25fps,ffmpeg会自动补帧或重复现有帧来填满每秒25帧的数量,最终总帧数刚好是600.12×25=15003,完美匹配标注工具的计算。

方案2:导出原视频真实帧数,让标注工具对齐实际情况

如果想要保留视频的真实帧,同时让标注工具的计算和实际导出一致,可以这么做:

  1. 先统计原视频的准确真实帧数
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 src/in.mp4
  1. 让标注工具用原视频的实际平均帧率(真实帧数 ÷ 总时长)计算,或者直接用统计出的真实帧数做标注。
  2. 导出真实帧时用这个命令,确保不丢帧不补帧:
ffmpeg -i src/in.mp4 -vsync 0 tmp/frame_%05d.jpg
  • 解释:-vsync 0(也叫passthrough模式)会严格按照原视频的帧时间戳导出所有真实存在的帧,导出帧数和ffprobe统计结果完全一致。

额外提醒

变帧率(VFR)视频很容易出现「理论帧数和实际导出帧数不符」的问题,下次遇到类似情况,先看ffmpeg输出里的fpstbr值判断是不是固定帧率视频,再选对应的导出方式就不会错啦。

备注:内容来源于stack exchange,提问作者wener

火山引擎 最新活动