動画からサムネイルを抽出する — -vframes と thumbnail フィルタ

動画のサムネイル画像を生成する方法はいくつかあります。このページでは FFmpeg 6.1 で確認済みのコマンドを、用途別に整理して解説します。


基本:特定タイムスタンプから1フレーム抽出

-ss でシーク位置を指定し、-vframes 1 で1フレームだけ出力するのが最もシンプルな方法です。

ffmpeg -i input.mp4 -ss 00:00:01 -vframes 1 thumbnail.jpg

-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