如何用FFmpeg一键生成视频不同时间点的多张缩略图?
用FFmpeg单命令提取视频多时间点缩略图的方案
嘿,这个需求我经常碰到,用FFmpeg一条命令就能轻松搞定,给你分享几个实用的方法:
1. 指定精确时间点提取
如果已经明确知道要提取的几个时间点(比如第10秒、25秒、40秒),可以用select滤镜直接筛选这些时间点的帧:
ffmpeg -i input.mp4 -vf "select='eq(t,10)+eq(t,25)+eq(t,40)',setpts=N/TB" -vsync vfr -q:v 2 thumb_%02d.jpg
参数解释:
eq(t,X):匹配视频中刚好X秒的帧,支持小数(比如eq(t,10.5)表示10.5秒)+:逻辑“或”,表示满足任意一个时间点条件就提取setpts=N/TB:修正输出帧的时间戳,避免出现重复或丢失帧的问题-vsync vfr:启用可变帧率输出,确保每个选中的帧都生成一张独立图片-q:v 2:设置JPG质量(数值越小质量越高,范围1-31,推荐1-5)thumb_%02d.jpg:输出文件名模板,%02d会自动替换为01、02、03这样的序号
2. 处理帧率不恒定的视频
如果视频帧率不稳定,eq(t,X)可能找不到精确匹配的帧,这时候可以改用时间范围匹配,提取X秒附近的第一帧:
ffmpeg -i input.mp4 -vf "select='gte(t,10)*lt(t,10.1)+gte(t,25)*lt(t,25.1)+gte(t,40)*lt(t,40.1)',setpts=N/TB" -vsync vfr -q:v 2 thumb_%02d.jpg
gte(t,X)*lt(t,X+0.1)表示提取X秒到X+0.1秒之间的第一帧,这样能保证一定能拿到对应时间点附近的画面。
3. 同时调整缩略图尺寸
如果需要生成指定大小的缩略图,可以在滤镜链里加上scale:
ffmpeg -i input.mp4 -vf "select='eq(t,10)+eq(t,25)+eq(t,40)',scale=320:-1,setpts=N/TB" -vsync vfr -q:v 2 thumb_%02d.jpg
scale=320:-1表示将宽度固定为320像素,高度按原视频宽高比自动计算,你也可以改成scale=-1:240固定高度。
小提示
- 如果要提取的时间点非常多,可以把时间点整理成一个表达式,比如
eq(t,5)+eq(t,12)+eq(t,18)+...,FFmpeg会自动处理所有条件 - 如果你更习惯按帧号提取(比如第300帧、第750帧),可以把
eq(t,X)换成eq(n,300),其中n是帧的序号(从0开始计数)
内容的提问来源于stack exchange,提问作者Parsa Saei
相关产品推荐
相关产品推荐

