写真を順番に見せる動画がスライドショー、長い録画を早送りにした動画がタイムラプスです。どちらも「入力の画像を何秒おきに使うか」と「出力をどの速さで再生するか」を分けて指定します。どの例も元のファイルはそのまま残り、別の動画ファイルができます。

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

img001.png、img002.png のような連番の画像から動画を作ります。

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

連番画像は、コマンドを実行するフォルダーに置きます。番号が途中で抜けていないか、拡張子がそろっているかも確認してください。

  • -framerate 1 — 入力を1秒に1枚の速さで読み込む(1枚を1秒ずつ表示)
  • -i img%03d.png — img001.png, img002.png, … を順番に読み込む
  • %03d は3桁の番号(足りない桁は0で埋める)。4桁なら %04d

出力を25fpsにする:

1枚1秒のまま出力を25fpsにするには、入力側の -framerate 1 はそのままにして、出力側に -r 25 を足します。

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

同じ画像のフレームを繰り返して25fpsにするだけです。写真と写真の間の動きを補ったり、切り替えにフェードを付けたりはしません。

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

1枚の画像から決まった長さの動画を作るときは、-loop 1 と -t を組み合わせます。

ffmpeg -loop 1 -i image.png -t 5 -c:v libx264 -pix_fmt yuv420p output.mp4
  • -loop 1 — 同じ画像を繰り返し読み込み続ける
  • -t 5 — 出力を5秒で止める
  • image.png は手元の画像ファイル名に置き換える

pix_fmt yuv420p の重要性

libx264 が出力するピクセル形式(色の記録方式)は、入力や設定によって変わります。PNG 画像は RGB なので、-pix_fmt yuv420p を付けないと yuv444p(H.264 の High 4:4:4)になり、多くのプレーヤーで再生できません。RGBA画像の透明度(アルファ)の情報は、H.264の動画には残りません。

多くのプレーヤーで再生できるようにするには、必ず -pix_fmt yuv420p を付けてください:

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

yuv420p は8ビット・4:2:0のピクセル形式で、色空間の指定とは別の設定です。色の情報を間引くので、細かい色の境目が少し変わることがあります。幅と高さは偶数にそろえてください。できた動画は、実際に使うプレーヤーで再生して確かめます。

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

fps フィルターでフレーム(動画の1コマ)を間引くだけでは、動画の長さは短くなりません。「どの間隔でフレームを取り出すか」と「取り出したフレームをどの時刻に再生するか」の両方を指定します。音声はそのまま残すと長さが合わないので、この例では消しています。

30fpsで10倍速の動画を作る例です。

ffmpeg -i input.mp4 -vf "fps=3,settb=AVTB,setpts=N/(30*TB),fps=30" -an -c:v libx264 -pix_fmt yuv420p timelapse-10x.mp4

毎秒3フレームを取り出し、それを毎秒30フレームで再生するので、約10倍速になります。settb=AVTB で時刻の単位を細かくしてから setpts で再生時刻を付け直し、最後の fps=30 でフレームの間隔をそろえます。入力の長さやフレーム数によっては、出力の長さに少し端数が出ます。

取り出す間隔 出力を30fpsで再生したときの速度
毎秒3フレーム 約10倍速
1秒に1フレーム 約30倍速
10秒に1フレーム 約300倍速

10秒ごとに1枚を取り出すときは次のようにします。60分の動画なら、出力は計算上約12秒です。

ffmpeg -i input.mp4 -vf "fps=1/10,settb=AVTB,setpts=N/(30*TB),fps=30" -an -c:v libx264 -pix_fmt yuv420p timelapse-300x.mp4

できた動画は再生して、長さ・動き・向きを確かめてください。

次の表は、20秒・320x180・30fps・音声なしの合成映像を、Windows版のFFmpeg 8.1で各1回処理したときの出力の長さです(2026-09-11)。

処理 実測した出力の長さ
比較用の fps=1/10 のみ(音声削除) 20.000000秒
上記の10倍速 2.000000秒
上記の300倍速 0.066667秒

測定の記録(JSON)には、使ったコマンドと入力の作り方も入っています。

短い動画から10秒ごとに取り出すと、出力は数フレームしかありません。見るための動画にするなら、素材の長さに合った倍率を選んでください。

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

カメラのインターバル撮影で撮った連番JPEGから動画を作る例です。

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

%04d は photo0001.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
1枚1秒・出力25fps 入力前 -framerate 1、出力前 -r 25
通常の動画 -framerate 24 または 30
タイムラプス(約10倍速) 上記の fps=3 と再生時刻変更を組み合わせる例

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

連番画像を読み込むとき、FFmpeg は内部で image2 デマルチプレクサ(入力を読み取る部品)を使います。ふつうは自動で選ばれますが、自分で指定することもできます。

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

-f image2 はふつう不要です。連番画像として認識されないときに付けてください。


関連記事:

よくある質問

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

画像の名前を連番にそろえ、上の入力を -framerate 1/3 -i img%03d.png にすると、1枚3秒になります。-pattern_type glob はビルドによっては使えないので、特にWindowsでは連番にするほうが扱いやすいです。

Ken Burns ズームを足したい

zoompan=z='min(zoom+0.0015,1.5)':d=125:s=1280x720 を使うと、各画像を約5秒かけてズームします。xfade と組み合わせると、スライドの切り替えをクロスフェードにできます。

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

撮影間隔が長いと、動くものの位置が大きく飛びます。撮り直せるなら、間隔を短くして撮り比べてください。tmix=frames=3 は隣り合うフレームを混ぜる処理です。失われた動きを取り戻すものではなく、残像が出ることがあります。

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

まず、画像の枚数と1枚の表示秒数から映像の長さを計算します。-shortest は短いほうのストリームで出力を終えるだけで、短い音声を延ばしてはくれません。音声をループするか無音で埋めるかを決めてから、全体の長さを指定してください。

縦と横の写真を混ぜたい

pad は余白を足すだけなので、大きな画像は縮みません。先に各画像を同じ大きさの枠に収めます。たとえば scale=1920:1080:force_original_aspect_ratio=decrease:force_divisible_by=2,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black,setsar=1 です。大きさの違う画像をそのまま連番で読み込むと、途中でフィルターの作り直し(再初期化)が起きます。先に画像の大きさをそろえておくと、結果を確かめやすくなります。