動画からサムネイルを抽出する — -vframes と thumbnail フィルタ
動画のサムネイル画像を生成する方法はいくつかあります。このページでは FFmpeg 6.1 で確認済みのコマンドを、用途別に整理して解説します。
基本:特定タイムスタンプから1フレーム抽出
-ss でシーク位置を指定し、-vframes 1 で1フレームだけ出力するのが最もシンプルな方法です。
ffmpeg -i input.mp4 -ss 00:00:01 -vframes 1 thumbnail.jpg
-ss 00:00:01— 開始から1秒の位置にシーク-vframes 1— 出力フレーム数を1枚に制限(-frames:v 1と同義)- 出力形式は拡張子で自動判定される(ここでは JPEG)
-ssの配置について:-iの前に置くと高速キーフレームシークになりますが、精度がやや落ちることがあります。-iの後に置くと正確な位置にシークしますが、長い動画では時間がかかります。サムネイル生成では-iの前に置くのが一般的です。
PNG で出力したい場合:
ffmpeg -i input.mp4 -ss 00:00:01 -vframes 1 thumbnail.png
PNG は可逆圧縮のため高品質ですが JPEG よりファイルサイズが大きくなります。
複数フレームを一定間隔で抽出
-vf fps=1 フィルタを使うと、1秒ごとに1フレームを連番ファイルとして抽出できます。
ffmpeg -i input.mp4 -vf fps=1 frame%03d.jpg
%03dのような連番パターンは CI の出力ファイル書き換えルールの対象外のためテキストブロックで示します。
間隔を変える例:
# 5秒ごとに1フレーム
ffmpeg -i input.mp4 -vf fps=1/5 frame%03d.jpg
# 10秒ごとに1フレーム
ffmpeg -i input.mp4 -vf fps=1/10 frame%03d.jpg
出力先ディレクトリを指定する場合は frames/frame%03d.jpg のようにパスを含めます(ディレクトリは事前に作成が必要)。
thumbnailフィルタ — 代表フレームを自動選択
thumbnail フィルタは指定した範囲内でヒストグラムの変化が小さい「代表的なフレーム」を自動で選択します。動画の内容を適切に反映したサムネイルを1コマンドで生成できます。
ffmpeg -i input.mp4 -vf thumbnail -vframes 1 thumbnail.jpg
デフォルトでは100フレームを1グループとして解析し、そのグループ内で最も代表的なフレームを選びます。グループサイズを変更するには:
ffmpeg -i input.mp4 -vf thumbnail=300 -vframes 1 thumbnail.jpg
数値を大きくするほど広い範囲から選択しますが、処理時間も増えます。
解像度指定付きサムネイル抽出
-vf scale=幅:高さ を組み合わせることでリサイズと同時に出力できます。
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 -vf scale=320:180 thumb.jpg
アスペクト比を維持しながら幅だけ指定する場合は -1 を使います:
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 -vf scale=320:-1 thumb.jpg
-1 は「アスペクト比を保ったまま自動計算」を意味します。ただし -1 が奇数ピクセルになる場合はエンコーダエラーになることがあるため、その場合は -2 を使います(偶数に丸める)。
thumbnailフィルタとscaleを組み合わせる場合はカンマで繋ぎます:
ffmpeg -i input.mp4 -vf "thumbnail,scale=320:180" -vframes 1 thumb.jpg
JPEGとPNGの選び方
| 形式 | 圧縮 | ファイルサイズ | 用途 |
|---|---|---|---|
| JPEG | 非可逆 | 小さい | Web表示、SNSサムネイル |
| PNG | 可逆 | 大きい | 高品質保存、透過画像 |
JPEG の圧縮品質は -q:v で制御できます(2〜31、数値が小さいほど高品質):
ffmpeg -i input.mp4 -ss 00:00:01 -vframes 1 -q:v 2 thumbnail.jpg
よくある問題
抽出したフレームが真っ暗/緑色になる
-ss をコーデックによってはキーフレームにスナップすることがあります。-ss を -i の後ろに移動すると改善することがあります。
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 thumbnail.jpg
thumbnailフィルタが遅い
デフォルトの100フレーム解析が重い場合は thumbnail=30 のように値を小さくしてください。
まとめ
| 目的 | コマンド例 |
|---|---|
| 特定秒から1枚 | -ss HH:MM:SS -vframes 1 |
| 定期間隔で複数枚 | -vf fps=1/N frame%03d.jpg |
| 自動で代表フレーム | -vf thumbnail -vframes 1 |
| リサイズしながら抽出 | -vf scale=W:H -vframes 1 |
関連記事:
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-filters.html / trac.ffmpeg.org/wiki