You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅通过一次FFmpeg系统调用获取视频首帧与末帧?

一次FFmpeg调用获取视频首帧与末帧的方法

无需提前获取时长的最优方案

直接通过select滤镜精准指定首帧和末帧,配合setpts滤镜修正时间戳,无需额外调用获取时长,命令如下:

ffmpeg -i input.mov -vf "select='eq(n,0)+eq(n,-1)',setpts=N/FRAME_RATE/TB" -q:v 1 -qmin 1 out%02d.jpg
  • select='eq(n,0)+eq(n,-1)':筛选第0帧(首帧)和倒数第一帧(末帧),+表示逻辑或
  • setpts=N/FRAME_RATE/TB:重置输出帧的时间戳,避免FFmpeg因时间戳异常丢弃帧

你原有命令的问题

你之前使用的ffmpeg -ss 00:00:00 -i input.mov -vf fps=1/duration -vframes 2 -q:v 1 -qmin 1 out%2d.jpg效果不符合预期,核心原因:

  • fps=1/duration是按固定时间间隔取帧,但视频实际帧率可能非整数,末帧的时间点不一定刚好对齐duration的整数位置,导致取不到真正的最后一帧
  • 必须提前通过额外调用获取时长,增加了操作复杂度和耗时

进阶优化(跳过黑帧场景)

如果视频存在黑帧开头/结尾,可在select滤镜中加入场景亮度判断,跳过黑帧:

ffmpeg -i input.mov -vf "select='(eq(n,0)+eq(n,-1))*gt(scene,0.1)',setpts=N/FRAME_RATE/TB" -q:v 1 -qmin 1 out%02d.jpg
  • gt(scene,0.1):筛选场景亮度大于0.1的帧(数值可根据实际情况调整)

内容的提问来源于stack exchange,提问作者Broshward

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:25:20