写真をまとめてスライドショー動画にしたり、長時間撮影した動画からタイムラプスを作ったりする際に FFmpeg は非常に便利です。FFmpeg 6.1 で確認済みのコマンドを用途別に解説します。


連番PNG → 動画(スライドショー)

img001.pngimg002.png のように連番になった画像ファイル群から動画を生成します。

ffmpeg -framerate 1 -i img%03d.png -c:v libx264 output.mp4

%03d のような連番パターンは CI の書き換えルールの対象外のためテキストブロックで示します。

  • -framerate 1 — 入力のフレームレートを1fps に指定(1枚あたり1秒表示)
  • -i img%03d.pngimg001.png, img002.png, … を順番に読み込む
  • %03d は3桁ゼロ埋め(4桁なら %04d

スライドショーを滑らかにする:

フレームレートを上げると再生がスムーズになります。ただし枚数が足りないと動画が短くなるため、-r 25 で出力フレームレートも合わせて指定します。

ffmpeg -framerate 1 -i img%03d.png -c:v libx264 -r 25 output.mp4

この場合、入力1fps(1枚1秒)を出力25fps に変換するため、各フレームが25回繰り返されて滑らかに見えます。


単一画像 → 短動画(ループ)

1枚の画像を指定秒数の動画にする場合は -loop 1-t を組み合わせます。

ffmpeg -loop 1 -i image.png -t 5 -c:v libx264 output.mp4
  • -loop 1 — 入力ストリームを無限ループ
  • -t 5 — 出力動画の長さを5秒に制限
  • image.png は KNOWN_EXTS に含まれるため bash ブロックで実行可能

pix_fmt yuv420p の重要性

libx264 でエンコードした動画は、デフォルトの pix_fmt がソース画像に依存します。PNG の場合 yuv444prgba になることがあり、QuickTime(macOS プレーヤー)や一部のモバイル端末で再生できないことがあります。

互換性を重視する場合は必ず -pix_fmt yuv420p を追加してください:

ffmpeg -loop 1 -i image.png -t 3 -c:v libx264 -pix_fmt yuv420p output.mp4

yuv420p は最も広く対応された色空間フォーマットです。品質のわずかな低下と引き換えに、ほぼすべての環境での再生互換性が確保されます。


タイムラプス(動画から間引き)

既存の動画からフレームを間引いて高速再生動画(タイムラプス)を作成します。-vf fps=1/N で「N秒に1フレーム」を取り出し、通常速度で再生することで N倍速のタイムラプスになります。

ffmpeg -i input.mp4 -vf fps=1/10 output.mp4
  • -vf fps=1/10 — 10秒に1フレームを取り出す(結果として10倍速のタイムラプス)
  • 元の動画が60分なら、出力は約6分の動画になります

速度の目安:

-vf fps=間引き間隔速度
fps=1/55秒に1フレーム5倍速
fps=1/1010秒に1フレーム10倍速
fps=1/3030秒に1フレーム30倍速
fps=1/601分に1フレーム60倍速

互換性のためにこちらも -pix_fmt yuv420p を付けることを推奨します:

ffmpeg -i input.mp4 -vf fps=1/10 -c:v libx264 -pix_fmt yuv420p output.mp4

連番JPG → 動画(タイムラプス用素材から)

カメラのインターバル撮影で得られた連番 JPEG から動画を作る場合:

ffmpeg -framerate 24 -i photo%04d.jpg -c:v libx264 -pix_fmt yuv420p output.mp4

%04dphoto0001.jpg, photo0002.jpg, … のような4桁ゼロ埋め連番に対応します。

開始番号を指定する場合 (photo0100.jpg から始まるなど):

ffmpeg -framerate 24 -start_number 100 -i photo%04d.jpg -c:v libx264 -pix_fmt yuv420p output.mp4

フレームレートまとめ

目的推奨設定
1枚1秒のスライドショー-framerate 1
滑らかなスライドショー-framerate 1 -r 25
通常の動画-framerate 24 または 30
タイムラプス(10倍速)-vf fps=1/10

image2 デマルチプレクサについて

FFmpeg は画像シーケンス入力に image2 デマルチプレクサを内部で使用します。通常は自動検出されますが、明示的に指定することも可能です:

ffmpeg -f image2 -framerate 25 -i img%03d.png -c:v libx264 output.mp4

-f image2 の指定は通常不要ですが、自動検出が効かない場合の回避策として覚えておくと便利です。


関連記事:


動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-filters.html / trac.ffmpeg.org/wiki/Slideshow


よくある質問

フォルダの画像からスライドショーを作る

ffmpeg -framerate 1/3 -pattern_type glob -i "*.jpg" -c:v libx264 -pix_fmt yuv420p out.mp41/3 は 1 枚 3 秒。

Ken Burns ズームを足したい

zoompan=z='min(zoom+0.0015,1.5)':d=125:s=1280x720 で各画像を約 5 秒かけてズーム。xfade と組み合わせるとスライド間にクロスフェード。

タイムラプスがカクカクする

ソースのフレームレートが低すぎ、またはシャッタースピードが速すぎてフレームにモーションブラーが乗ってない。撮影時にインターバルを伸ばすか、tmix=frames=3 でブラーを後付け。

スライドショーで音が途中で切れる

duration = images × seconds_per_image を計算して音声入力に -t duration を指定 + -shortest で両ストリームを合わせる。

縦と横の写真を混ぜたい

両方を同じキャンバスに pad: pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black で縦写真にサイドバー、横写真は自然にフィット。