截图与生成缩略图
本教程共 32 篇 · 第 12 篇 · 更新于 2026-08-09 · 约 6 分钟阅读
本节目标:会在指定时刻截一张图,会每隔几秒批量截图,还会把多张缩略图拼成一张雪碧图。
视频截图需求很常见:做封面、做预览、给文章配图。FFmpeg 提供了几种不同粒度的截法。
截某一时刻的一帧
最基础的写法:
ffmpeg -ss 00:01:24 -i input.mp4 -frames:v 1 output.jpg
-ss 00:01:24:定位到 1 分 24 秒。-frames:v 1(也可写-vframes 1):只输出 1 帧视频。- 输出一张 JPG。
为了更快,可以把 -ss 放在 -i 前面,FFmpeg 会用关键帧定位:
ffmpeg -ss 00:01:24 -i input.mp4 -frames:v 1 output.jpg
控制图片质量
JPG 可以用 -q:v 控制质量,取值 2-31 之间(不同版本范围略有差异),数值越小质量越好、文件越大。一般 2-5 效果不错:
ffmpeg -ss 00:01:24 -i input.mp4 -frames:v 1 -q:v 2 output.jpg
想无损保存就用 PNG:
ffmpeg -ss 00:01:24 -i input.mp4 -frames:v 1 output.png
Tip截取一帧时,把
-ss放在-i前面可能截到的是关键帧附近的画面,不是精确那一帧。要帧精确,要么把-ss放-i后面(慢一些),要么重编码。截图本来就只解一帧,慢也慢不到哪去。
按时间间隔截多张
每隔 N 秒截一张
用 fps 滤镜:
# 每 10 秒截一张
ffmpeg -i input.mp4 -vf fps=1/10 out_%03d.jpg
fps=1/10 表示每秒输出 1/10 帧,也就是每 10 秒一帧。%03d 是三位序号,生成 out_001.jpg、out_002.jpg……
反过来,fps=1 是每秒一张,fps=1/60 是每分钟一张。
指定总张数
# 总共截 10 张,均匀分布
ffmpeg -i input.mp4 -vf "fps=10/600" out_%03d.jpg
如果视频长 600 秒,想要 10 张,fps 就是 10/600。
在指定时间点截图
用 select 滤镜精确选帧:
# 在第 5 秒、第 30 秒、第 60 秒各截一张
ffmpeg -i input.mp4 -vf "select='eq(n,150)+eq(n,900)+eq(n,1800)'" -vsync vfr out_%03d.jpg
这要求你知道帧数。如果是 30fps 视频,第 5 秒就是第 150 帧(帧号从 0 开始,实际是第 151 帧)。更方便的做法是用时间戳:
ffmpeg -i input.mp4 -vf "select='between(t,5,5.1)+between(t,30,30.1)+between(t,60,60.1)'" -vsync vfr out_%03d.jpg
自动挑选精彩画面
thumbnail 滤镜会在视频里采样若干帧,自动挑一张信息量最大的(通常是画面变化丰富的那一帧):
ffmpeg -i input.mp4 -vf "thumbnail,scale=-1:720" -frames:v 1 thumb.jpg
thumbnail默认每 100 帧分析一次,挑最优。thumbnail=30改成每 30 帧分析一次(更精细但更慢)。- 配合
scale把缩略图缩放到合适大小。
想挑 3 张候选自己选:
ffmpeg -i input.mp4 -vf "thumbnail=30,scale=-1:720" -frames:v 3 thumb_%03d.png
生成缩略图拼图(雪碧图)
视频网站常见的那种「一张图里排列着多个小预览画面」,用 tile 滤镜就能做。
先每隔一段时间截一帧,再拼成网格:
ffmpeg -i input.mp4 \
-vf "fps=1/10,scale=320:-1,tile=4x3" \
-frames:v 1 \
sheet.jpg
拆解一下:
fps=1/10:每 10 秒取一帧。scale=320:-1:每帧缩到宽 320,高度按比例。tile=4x3:排成 4 列 3 行,共 12 张。-frames:v 1:只输出一张拼图。
如果视频 120 秒,每 10 秒一帧正好 12 张,铺满 4×3。视频更长就多出来,需要调大网格或帧率。比如 5×5 放 25 张:
ffmpeg -i input.mp4 -vf "fps=1/30,scale=240:-1,tile=5x5" -frames:v 1 sheet.jpg
带边距的拼图
tile 支持边距和间距:
ffmpeg -i input.mp4 \
-vf "fps=1/10,scale=320:-1,tile=4x3:margin=10:padding=5" \
-frames:v 1 sheet.jpg
margin=10:外圈边距 10 像素。padding=5:缩略图之间间距 5 像素。
给每张缩略图加时间戳
结合 drawtext 滤镜(§25 详细讲):
ffmpeg -i input.mp4 \
-vf "fps=1/10,scale=320:-1,drawtext=text='%{pts\:hms}':x=10:y=10:fontsize=24:fontcolor=white:box=1:boxcolor=black@0.5,tile=4x3" \
-frames:v 1 sheet.jpg
每张缩略图左上角会显示对应的时间码。
生成视频预览 GIF
把多张截图拼成一个会动的预览短片:
ffmpeg -i input.mp4 \
-vf "fps=1/5,scale=320:-1" \
-c:v gif preview.gif
每 5 秒一帧、宽 320 的 GIF 预览。更好的 GIF 生成方式在 §15 讲。
从封面图提取
视频文件可能本身内嵌了封面图(attached pic)。可以直接提取:
ffmpeg -i input.mp4 -map 0:v -map -0:v:0 -frames:v 1 cover.jpg
更通用的做法是用 ffprobe 先找出 disposition 为 attached_pic 的流,再 dump 出来。大多数情况下直接 thumbnail 生成更省事。
常见问题
截图是黑的。
某些视频在开头几秒就是黑屏,或者你截到了全黑帧。换个时间点,或者用 thumbnail 自动选帧。
截出来的图颜色不对。
可能是色彩空间标记缺失。加 -pix_fmt yuv420p 通常能解决:
ffmpeg -ss 10 -i input.mp4 -frames:v 1 -pix_fmt yuv420p out.jpg
想要 PNG 但文件太大。
PNG 是无损的。截图用 JPG -q:v 2 视觉上和 PNG 几乎没区别,体积小很多。
小结
- 截一张:
-ss 时间 -i 输入 -frames:v 1 out.jpg。 - JPG 质量用
-q:v 2(越小越好),要无损用 PNG。 - 批量截图用
fps=1/N滤镜,每 N 秒一张。 - 自动挑精彩画面用
thumbnail。 - 拼图用
tile=列x行,支持边距和间距。 - 雪碧图 =
fps + scale + tile的组合。
下一章讲画面的几何变换:缩放、裁剪和旋转。