FFmpegで動画のフレームをPNGやJPGとして書き出すと、コンタクトシート、サムネイル、別の編集処理に利用できます。デコードした全フレーム、1秒ごとなどの一定間隔、指定時刻付近の1枚から選べます。

書き出す前に: 空の出力フォルダを用意し、元動画は残します。10分・30fpsなら約18,000枚になるため、短い素材で容量を確認してください。

1. 1枚だけキャプチャする

静止画を1枚だけ書き出す基本の形です。動画の冒頭(0.5秒の直前)のフレームを1枚書き出して停止します。

ffmpeg -i input.mp4 -vf fps=1 -frames:v 1 output.png
  • -vf fps=1 … 1秒あたり1フレームでサンプリング
  • -frames:v 1 … 最初に一致したフレームだけを書き出す
  • output.png … 1枚のPNG画像

特定の瞬間のフレームを取るには、入力の前にシークします。次のコマンドは5秒地点のフレームを取り出します。

ffmpeg -ss 00:00:05 -i input.mp4 -frames:v 1 output.png
オプション 意味
-ss 00:00:05 読み込み前に5秒へシーク
-frames:v 1 正確に1フレームだけ出力

入力側の-ssは近くのキーフレームへ移動し、トランスコード時に既定で有効な正確なシークにより、指定時刻までデコード・破棄します。ただし指定時刻が実際のフレーム間にある場合、その瞬間の画像を新しく作るわけではありません。タイムスタンプの破損や特殊な入力も影響するため、出来事の正確な記録として使うときはプレイヤーと比較してください。Seeking wiki を参照してください。

2. 1秒ごとに1フレーム抽出する

動画を一定間隔の静止画群にするには、fps でサンプリングして連番で書き出します。

ffmpeg -i input.mp4 -vf fps=1 output_%04d.png

これで output_0001.png、output_0002.png… と、動画の1秒ごとに1枚の画像が生成されます。

  • -vf fps=1 … 1秒あたり1フレーム(5秒ごとなら fps=1/5、毎秒2枚なら fps=2)
  • output_%04d.png … %04d がゼロ埋めの連番になる

PowerShellや対話型シェルではoutput_%04d.pngを文字どおり入力します。数値への置き換えはFFmpegが行います。Windowsの.bat/.cmdファイル内ではoutput_%%04d.pngと%を重ねます。連番のファイル名は撮影時刻の記録ではありません。

3. 全フレームを書き出す

デコードされた各フレームを、fps同期による追加・間引きなしで書き出すには、レート変更フィルタを付けず、passthroughを指定します。

ffmpeg -i input.mp4 -fps_mode passthrough output_%04d.png

デコードされた各フレームを1枚ずつ出力する指定です。既定の同期モードでは入力によって複製・間引きが発生するため、フィルタを省くだけでは十分ではありません。連番PNGにはVFRの元の間隔は残らないので、動画へ戻す用途では表示時刻も別に保存してください。

目的 フィルタ 結果
全デコードフレーム レート変更なし、-fps_mode passthrough fps同期による複製・間引きなし
1秒ごと -vf fps=1 1枚/秒
5秒ごと -vf fps=1/5 1枚/5秒
毎秒2枚 -vf fps=2 2枚/秒

4. PNGとJPGと画質

合成VFR素材で枚数を確認

2026-09-12、WindowsのネイティブFFmpeg 8.1で、生成した3秒のVFR素材から上記のpassthroughコマンドを実行し、50デコードフレームから50枚の空でないPNGを得ました。また、連番や-update 1を付けずにsingle.pngへ2枚出そうとすると、1枚目の後にエラーで終了しました。条件と出力ハッシュを公開しています。

保存形式を選ぶ

PNGは出力画像を可逆圧縮しますが、その前の動画デコード、YUVからRGBへの変換、縮小、HDR処理などで画素値が変わる場合があります。圧縮動画のデータとバイト単位で同じという意味ではありません。JPGは非可逆圧縮で、容量を抑えたいプレビューに使えます。JPGで1枚書き出す例です。

ffmpeg -ss 00:00:05 -i input.mp4 -frames:v 1 -q:v 2 output.jpg
  • -q:v 2 … JPG画質(2は高画質。2〜31のスケールで、小さいほど高画質)
形式 サイズ 画質 向いている用途
PNG 大 無劣化 編集・保存・透過
JPG 小 非可逆 プレビュー・コンタクトシート・Web

代表的な1枚を選んでサムネイルに仕上げる方法はサムネイル抽出ガイドを参照してください。

5. 抽出と同時にリサイズする

scale をフレーム選択と組み合わせれば、小さい画像を直接書き出せます。次のコマンドは5秒地点のフレームを取り、幅640pxにスケールします(高さは比率を保って自動)。

ffmpeg -ss 00:00:05 -i input.mp4 -vf scale=640:-1 -frames:v 1 output.png
  • scale=640:-1 … 幅を640に、-1 でFFmpegがアスペクト比を保つ高さを計算

フィルタは連結できます。例えば -vf "scale=640:-1,fps=1" でリサイズとサンプリングを同時に行えます。

6. トラブルシューティング

症状1: 複数欲しかったのに画像が1枚しか出ない

原因: -frames:v 1が残っている、または連番パターンがありません。image2では連番のない名前で2枚目を出そうとするとエラーになる場合があります。同じ画像を繰り返し更新するのは通常-update 1などを指定した場合です。 解決策: 連番画像にするには、出力名に %04d(または同様の連番)を含めます(第2章)。

症状2: 抽出したフレームが狙った瞬間から少しずれる

原因: 指定時刻がフレーム間にある、プレイヤーとストリームで時刻の数え方が違う、VFRやタイムスタンプ破損の影響などを確認します。 解決策: 前後の時刻と出力を比較します。入力シークとの比較用に、-ssを-iの後ろへ置く方法もあります。こちらは先頭からデコード・破棄します。

ffmpeg -i input.mp4 -ss 00:00:05 -frames:v 1 output.png

症状3: PNGファイルが巨大

原因: PNGは可逆圧縮ですが、高解像度やノイズの多い画像は大きくなります。 解決策: 短い素材でJPGの-q:vや縮小と比較します。

よくある質問

Q1. フレーム抽出とサムネイル作成の違いは? A. フレーム抽出は、選んだレートで静止画をそのまま書き出します。サムネイル作成の手順は、代表的な1枚を選ぶ処理とサイズ調整を加えたものです。

Q2. N秒ごとに1フレーム取るには? A. -vf fps=1/N を使います。例えば fps=1/10 は10秒ごとに1フレームです。

Q3. PNGではなくJPGで抽出できますか? A. できます。出力名を .jpg にし、高画質なら -q:v 2 を使います(第4章)。

Q4. 画像シーケンスが上書きされてしまうのはなぜ? A. 同じ画像を更新する-update 1や、前回の出力フォルダの再利用を確認してください。連番には%04dを文字どおり指定し(Windowsバッチでは%%04d)、新しい出力先を使います。

Q5. フレーム抽出は元動画に影響しますか? A. これらの例は動画を読み、別の画像ファイルへ保存します。大切な出力名を再利用したり、確認せず上書きオプションを付けたりしないでください。1枚だけならブラウザのサムネイル抽出で大量の書き出しを避けられます。

関連記事