首页 / FFmpeg 入门教程 / 截图与生成缩略图

FFmpeg 入门教程

截图与生成缩略图

本教程共 32 篇 · 第 12 篇 · 更新于 2026-08-09 · 约 6 分钟阅读

FFmpeg截图缩略图thumbnailtile雪碧图-vframes

本节目标:会在指定时刻截一张图,会每隔几秒批量截图,还会把多张缩略图拼成一张雪碧图。

视频截图需求很常见:做封面、做预览、给文章配图。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.jpgout_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 的组合。

下一章讲画面的几何变换:缩放、裁剪和旋转。