【簡単】ffmpegで複数PNG画像をMP4動画にするコマンド手順

はい、承知いたしました。FFmpegを使用して複数のPNG画像からMP4動画を作成する手順について、詳細な説明を含む約5000語の記事を作成します。初心者の方でも理解しやすいように、丁寧に解説します。


FFmpegで複数のPNG画像を超簡単に高品質MP4動画にする究極ガイド

写真の連番ファイルや、デザインツールから書き出した静止画シーケンスを、手軽に一本の動画にしたいと思ったことはありませんか? 例えば、タイムラプス撮影した大量の画像、ストップモーションアニメーションの素材、プレゼンテーション資料のスライド画像などです。

そんな時、強力な味方となるのが「FFmpeg」です。

FFmpegは、音声・動画のエンコード、デコード、変換、ストリーミングなど、様々なマルチメディア処理をコマンド一つで行える、非常に高機能なオープンソースライブラリおよびツールセットです。一見難しそうに見えますが、実は基本的な使い方を覚えれば、複数の画像から動画を作成するのは驚くほど簡単なのです。

この記事では、FFmpegを使って複数のPNG画像ファイルを超簡単に、かつ高品質なMP4動画に変換する手順を、初心者の方でもつまずかないように、ひとつずつ丁寧に解説していきます。コマンドの意味から画像の準備、応用的な設定まで、この記事を読めばあなたもFFmpegで画像から動画を作成できるようになります。

さあ、始めましょう!

なぜFFmpegを使うのか?

画像から動画を作成する方法はいくつかあります。専用の動画編集ソフトを使うのが一般的かもしれません。しかし、FFmpegには以下のような魅力があります。

  1. 無料かつオープンソース: 誰でも自由に使え、開発が活発に行われています。
  2. 高機能かつ高速: 多くのコーデック(圧縮形式)やフォーマットに対応しており、効率的に処理を行えます。
  3. コマンドラインベース: 一度コマンドを覚えれば、繰り返し同じ作業を効率的に行えます。また、スクリプトと組み合わせることで、大量のファイル処理や自動化も容易になります。
  4. 軽量: グラフィカルなインターフェースを持たないため、比較的動作が軽快です。
  5. 高品質な出力: 細かい設定が可能で、画質やファイルサイズを自由にコントロールできます。

最初はコマンドラインに抵抗があるかもしれませんが、本記事で説明する基本的なコマンドは非常にシンプルです。一度体験すれば、その便利さにきっと気づくはずです。

FFmpegを使うための準備

FFmpegを使うには、まずお使いのコンピューターにFFmpegをインストールする必要があります。インストール手順はOSによって異なります。

1. FFmpegのインストール

  • Windows:
    1. FFmpegの公式サイト(https://ffmpeg.org/download.html)にアクセスします。
    2. Windowsのアイコンをクリックし、推奨されているリンク(例: gyan.dev または BtbN)をクリックします。
    3. release build または full build のZIPファイルをダウンロードします。
    4. ダウンロードしたZIPファイルを展開します(例: C:\ffmpeg のような分かりやすい場所)。
    5. 展開したフォルダの中の bin フォルダ(ffmpeg.exe が含まれている場所)のパスを、システムの環境変数 Path に追加します。これにより、どのディレクトリからでもコマンドプロンプトやPowerShellで ffmpeg コマンドが実行できるようになります。
      • 環境変数の編集方法(Windows 10/11の場合):
        • スタートボタンを右クリックし、「システム」を選択します。
        • 「システム情報」(または関連する項目)を探し、「システムの詳細設定」をクリックします。
        • 「システムのプロパティ」ウィンドウが表示されるので、「詳細設定」タブの「環境変数」ボタンをクリックします。
        • 「環境変数」ウィンドウで、システム環境変数の中から「Path」を選択し、「編集」ボタンをクリックします。
        • 「環境変数名の編集」ウィンドウで、「新規」をクリックし、FFmpegの bin フォルダのパス(例: C:\ffmpeg\bin)を入力して「OK」を閉じます。
        • すべてのウィンドウを「OK」で閉じます。
      • 環境変数の変更を反映させるには、コマンドプロンプトまたはPowerShellを一度閉じてから再度開き直す必要があります。
  • macOS:
    1. macOSでは、パッケージマネージャーであるHomebrewを使うのが最も簡単です。Homebrewがインストールされていない場合は、まずHomebrewの公式サイト(https://brew.sh/index_ja)の手順に従ってインストールします。
    2. ターミナルを開き、以下のコマンドを実行します。
      bash
      brew install ffmpeg
    3. Homebrewが自動的にFFmpegをダウンロードしてインストールしてくれます。
  • Linux (Debian/Ubuntu系):
    ターミナルを開き、以下のコマンドを実行します。
    bash
    sudo apt update
    sudo apt install ffmpeg
  • Linux (Fedora系):
    ターミナルを開き、以下のコマンドを実行します。
    bash
    sudo dnf install ffmpeg
  • Linux (Arch Linux系):
    ターミナルを開き、以下のコマンドを実行します。
    bash
    sudo pacman -S ffmpeg

2. FFmpegがインストールされたか確認

インストールが完了したら、コマンドプロンプト(Windows)またはターミナル(macOS/Linux)を開き、以下のコマンドを入力してEnterキーを押してください。

bash
ffmpeg -version

FFmpegのバージョン情報が表示されれば、インストールは成功です。

ffmpeg version nX.X.X-XXXXX-gXXXXXXXXXXX Copyright (c) 2000-XXXX the FFmpeg developers
built with ...
...

このような出力が表示されない場合や、「’ffmpeg’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」のようなエラーが出る場合は、環境変数Pathの設定が間違っているか、コマンドプロンプト/ターミナルを再起動していない可能性があります。手順を見直してみてください。

画像の準備:ファイル名の命名規則

FFmpegが複数の画像を連番のシーケンスとして認識するためには、画像ファイルが特定の命名規則に従っている必要があります。最も一般的で簡単なのは、以下のような連番を含むファイル名です。

image0001.png
image0002.png
image0003.png
...
image1234.png
...

重要なのは以下の点です。

  • ベース名: 連番以外の部分(例: image)。すべてのファイルで同じである必要があります。
  • 連番: 数字の部分(例: 0001, 0002)。
  • パディング: 連番の桁数を揃えるために先頭をゼロで埋めること(例: 0001 は4桁)。ファイル数が10枚未満ならゼロ埋めなしでも動作することがありますが、10枚以上(特に100枚、1000枚を超える場合)になると、ゼロ埋めしないとFFmpegが正しく順番を認識できないことがあります。例えば、image1.png, image10.png, image2.png という順序で読み込まれてしまう可能性があります。image01.png, image02.png, …, image10.png のようにゼロ埋めすれば、正しい順番で読み込まれます。ファイル数が多い場合は、連番の桁数をファイル総数に合わせて十分に取る(例: 1000枚なら4桁 00011000、10000枚なら5桁 0000110000)ことを強く推奨します。
  • 拡張子: すべてのファイルで同じ拡張子である必要があります(例: .png)。.jpg でも .tif でも構いませんが、混在はできません。

ほとんどの場合、カメラで撮影した連番写真や、ソフトウェアから書き出した連番画像は、この規則に近い名前になっているはずです。もしファイル名がバラバラな場合は、FFmpegで処理する前にファイル名を整理する必要があります。この後、ファイル名を整理する方法についても解説します。

使用する画像ファイルは、すべて同じディレクトリ(フォルダ)にまとめておくと、コマンドがシンプルになります。

基本コマンド:画像からMP4への変換

画像の準備ができたら、いよいよFFmpegコマンドの実行です。コマンドプロンプトまたはターミナルを開き、画像ファイルが保存されているディレクトリに移動します。

“`bash

例:Windowsの場合

cd C:\Users\YourName\Pictures\MyImageSequence

例:macOS/Linuxの場合

cd ~/Pictures/MyImageSequence
“`

移動したら、以下の基本コマンドを実行します。

bash
ffmpeg -framerate 10 -i image%04d.png output.mp4

このコマンドを実行すると、image0001.png から始まる連番PNG画像が、フレームレート10fpsのMP4動画 output.mp4 として同じディレクトリに作成されます。

コマンドの詳細解説

さて、このシンプルなコマンドに何が指定されているのか、詳しく見ていきましょう。

  • ffmpeg: これは実行するプログラム名です。FFmpegを起動します。
  • -framerate 10: これは入力オプションです。入力される画像シーケンスを1秒あたり何枚の画像として扱うかを指定します。単位はfps (frames per second) です。
    • 10 を指定すると、10枚の画像で1秒間の動画が構成されます。つまり、各画像は約0.1秒間表示されることになります。
    • この値を大きくする(例: 3060)と、より滑らかな動きの動画になりますが、生成される動画の長さは短くなります。例えば、同じ100枚の画像でも、-framerate 10 なら10秒の動画になりますが、-framerate 30 なら約3.33秒の動画になります。
    • 一般的に、映画は24fps、テレビ放送や一般的なPC動画は30fpsまたは60fpsが使われます。作成したい動画の種類に合わせて適切な値を設定してください。タイムラプスなら低めに(5〜15fps)、ストップモーションなら動きに合わせて(8〜24fps)、スライドショーなら各画像の表示時間を考慮して計算(例: 1枚を3秒表示なら 1 / 3 = 0.333... ですが、FFmpegは整数や簡単な分数で指定することが多いため、1/3 または -framerate 0.333 のように指定するか、後述のdurationオプションを使う方法もありますが、ここではシンプルな-framerateを使います。実際には、スライドショーのように各画像に時間をかけたい場合は、-framerateを低く設定し、各画像の表示時間を調整するか、後述のlooptオプションを使う方が一般的ですが、まずは-framerateで基本的な流れを掴みましょう。例えば、1枚の画像を5秒表示したいなら、-framerate 1/5 と指定すれば、1秒間に1/5枚(つまり5秒で1枚)のペースで画像を読み込みます。これは -framerate 0.2 と同等です。)
  • -i image%04d.png: これも入力オプションです。入力ファイル(群)を指定します。
    • -i: 入力ファイルを指定するオプションです。
    • image%04d.png: これが、FFmpegに入力画像シーケンスのファイル名を伝える部分です。
      • image: ファイル名のベース名です。
      • %04d: ここが連番の部分を指定しています。
        • %d: 整数が入ることを示します。
        • %04d: 整数をゼロ埋め4桁で扱うことを示します。もしファイル名が image1.png, image2.png, … であれば %d.png と指定します。image01.png, image02.png, … であれば %02d.png と指定します。ファイル名のゼロ埋めの桁数に合わせてここを変更してください。ファイル数が多くて連番が 0001 から 9999 まであるなら %04d00001 から 99999 までなら %05d のように指定します。
      • .png: ファイルの拡張子です。使用している画像の拡張子に合わせて .jpg.tif などに変更してください。
    • この -i オプションは、一般的に入力ファイル(または入力ストリーム)を指定するために使われますが、このように画像シーケンスのパターンを指定することも可能です。
  • output.mp4: これは出力ファイル名です。作成される動画ファイルの名前を指定します。拡張子を .mp4 とすることで、FFmpegは自動的にMP4コンテナ形式で出力しようとします。

ファイル名が連番になっていない場合

もし画像ファイル名がバラバラだったり、連番になっていても桁数が揃っていなかったりする場合は、FFmpegで処理する前にファイル名を連番に整理する必要があります。これはFFmpeg自体ではなく、OSのコマンドやスクリプトを使って行います。

画像が大量にある場合、手動でリネームするのは現実的ではありません。ここでは、コマンドを使って一括リネームする方法をいくつか紹介します。

画像が保存されているディレクトリに移動してから、以下のコマンドを実行してください。以下の例では、現在のディレクトリにあるすべてのPNGファイルを image0001.png, image0002.png, … の形式にリネームすることを想定しています。ファイルの種類や開始番号は適宜変更してください。

Windows (PowerShell)

PowerShellを使うのが最も柔軟で強力です。

powershell
$i = 1
Get-ChildItem *.png | Sort-Object Name | ForEach-Object {
$newName = "image{0:D4}.png" -f $i
Rename-Item -Path $_.FullName -NewName $newName
$i++
}

解説:

  • $i = 1: 連番の開始番号を1に設定します。
  • Get-ChildItem *.png: 現在のディレクトリにある .png 拡張子のすべてのファイルを取得します。必要に応じて *.jpg などに変更してください。
  • |: パイプライン演算子。左側のコマンドの出力を右側のコマンドに渡します。
  • Sort-Object Name: 取得したファイルを名前順にソートします。これにより、元のファイル名がどんなにバラバラでも、名前順(エクスプローラーで見た時の順序)で連番が振られます。
  • ForEach-Object { ... }: ソートされたファイル一つ一つに対して { ... } 内の処理を実行します。$_ は現在のファイルオブジェクトを表します。
  • $newName = "image{0:D4}.png" -f $i: 新しいファイル名を生成します。
    • "image{0:D4}.png": 新しいファイル名のフォーマット文字列です。
      • image: ベース名。変更可能です。
      • {0:D4}: 0番目の引数($i)を、10進数(D)で、桁数を4桁(4)にゼロ埋めしてフォーマットすることを意味します。ファイル数に応じて D3 (3桁), D5 (5桁) などに変更してください。
      • .png: 拡張子。元のファイルと同じにしてください。
    • -f $i: フォーマット演算子。文字列テンプレート {0:D4} に変数 $i の値を適用します。
  • Rename-Item -Path $_.FullName -NewName $newName: 現在のファイル($_.FullName はファイルのフルパス)を、生成した新しい名前($newName)に変更します。
  • $i++: 連番カウンタを1つ増やします。

注意: このコマンドを実行すると、元のファイル名に戻すのは難しくなります。重要なファイルに対して実行する前には、必ずバックアップを取るか、テスト用のフォルダで試してください。

Windows (コマンドプロンプト – シンプルな例)

コマンドプロンプトの ren コマンドはPowerShellほど柔軟ではありませんが、簡単な連番リネームなら可能です。ただし、桁数のゼロ埋めなどは工夫が必要です。以下は、元のファイル名に既に連番が含まれていて、ゼロ埋めだけを調整したいような限定的なケースに使える場合があります。

例: IMG_0001.png -> image0001.png (ベース名変更)

cmd
ren IMG_*.png image*.png

これはあくまでシンプルなパターン置換です。例えば IMG_1.png, IMG_2.png, IMG_10.pngimage0001.png, image0002.png, image0010.png のようにゼロ埋めしながら連番にするのは ren コマンド単体では難しいです。PowerShellを使うか、より本格的なスクリプト言語(Pythonなど)を使うことを推奨します。

もしどうしてもコマンドプロンプトで連番にしたい場合は、少し複雑なバッチファイルを書く必要があります。例として、ファイル名にスペースがない前提で、現在のPNGファイルを image0001.png, image0002.png, … にリネームするバッチファイル例です。

“`batch
@echo off
setlocal enabledelayedexpansion

set count=1
for %%f in (*.png) do (
set “newName=image%count%.png”
rem Pad with leading zeros if needed (this requires more logic)
rem For simple case like image1.png to image001.png, padding logic needed here
rem This simple example just does image1.png, image2.png etc.
rem To add padding in batch, it’s complex. Example for 4 digits:
set “paddedCount=0000%count%”
set “paddedCount=!paddedCount:~-4!”
set “finalNewName=image!paddedCount!.png”

echo Renaming "%%f" to "!finalNewName!"
ren "%%f" "!finalNewName!"
set /a count+=1

)
endlocal
“`

このバッチファイル例は、ゼロ埋め処理 (set "paddedCount=0000%count%" set "paddedCount=!paddedCount:~-4!") を含んでいますが、PowerShellやBashに比べると直感的ではありません。やはりPowerShellの使用をおすすめします。

macOS / Linux (Bash)

Bashシェルを使うのが一般的です。mv コマンドと連番生成、ゼロ埋めを組み合わせます。

bash
i=1;
for file in *.png; do
# ファイルが存在するか確認 (隠しファイル等を除外)
if [ -f "$file" ]; then
# ゼロ埋めした連番を生成 (例: 4桁)
newName=$(printf "image%04d.png" $i)
# リネーム実行
echo "Renaming \"$file\" to \"$newName\""
mv "$file" "$newName"
i=$((i+1))
fi
done

解説:

  • i=1: 連番の開始番号を1に設定します。
  • for file in *.png; do ... done: 現在のディレクトリにある .png 拡張子のファイル一つ一つに対してループ処理を行います。必要に応じて *.jpg などに変更してください。ファイル名の順番は、シェルのglob展開の順序(通常はアルファベット順)になります。ファイル名を特定の順序で処理したい場合は、ls -v *.png のようにソートして while read file; do ... done で処理するなどの工夫が必要です。例:
    bash
    i=1;
    ls -v *.png | while read file; do
    newName=$(printf "image%04d.png" $i)
    echo "Renaming \"$file\" to \"$newName\""
    mv "$file" "$newName"
    i=$((i+1))
    done

    ls -v は、ファイル名を自然な数値順にソートしてくれるオプションです(例: image1.png, image2.png, …, image10.png)。
  • if [ -f "$file" ]; then ... fi: $file が通常のファイルであるかを確認します。
  • newName=$(printf "image%04d.png" $i): 新しいファイル名を生成します。
    • printf "image%04d.png" $i: C言語のprintfに似たコマンドで文字列をフォーマットします。image はベース名、%04d はゼロ埋め4桁の10進数、.png は拡張子です。桁数は必要に応じて %03d (3桁), %05d (5桁) などに変更してください。
    • $(...): コマンドの実行結果を変数に代入します。
  • echo "Renaming \"$file\" to \"$newName\"": 実行するリネーム処理を画面に表示します(確認用)。
  • mv "$file" "$newName": ファイル $file$newName という名前に変更(移動)します。ファイル名にスペースが含まれる可能性を考慮してダブルクォーテーション " で囲んでいます。
  • i=$((i+1)): 連番カウンタを1つ増やします。

注意: こちらも実行前に必ずバックアップを取るか、テスト用のフォルダで試してください。

ファイル名が連番に整理できたら、最初の基本コマンドが使えるようになります。

より高品質な動画を作成するためのオプション

基本コマンド ffmpeg -framerate 10 -i image%04d.png output.mp4 は、デフォルトの設定でMP4動画を作成します。しかし、画質やファイルサイズ、エンコード速度などをコントロールするために、いくつかの重要なオプションがあります。

1. ビデオコーデックの指定 (-c:v)

FFmpegは非常に多くのビデオコーデックをサポートしていますが、MP4コンテナで広く互換性があり、高圧縮率かつ高画質であるH.264(AVC)またはH.265(HEVC)を使うのが一般的です。特に指定しない場合、FFmpegはデフォルトでH.264(libx264エンコーダー)を使用することが多いですが、明示的に指定することで意図を明確にできます。

  • H.264 (libx264): 現在最も広く使われているコーデックです。多くのデバイスやソフトウェアで再生できます。
    bash
    ffmpeg -framerate 10 -i image%04d.png -c:v libx264 output.mp4
  • H.265 (libx265): H.264より新しいコーデックで、同等の画質であればファイルサイズをより小さくできます。ただし、対応しているデバイスやソフトウェアはH.264ほど多くありません。
    bash
    ffmpeg -framerate 10 -i image%04d.png -c:v libx265 output.mp4

    特別な理由がなければ、まずは互換性の高い libx264 を使うのがおすすめです。

2. 画質の調整 (-crf または -q:v)

ビデオエンコードにおいて、画質とファイルサイズはトレードオフの関係にあります。FFmpegでは、これらのバランスを調整するためにいくつかの方法がありますが、静止画からの変換では-crf(Constant Rate Factor)または-q:v(Constant Quantizer)がよく使われます。-crfの方がより新しい推奨される方法です。

  • -crf (Constant Rate Factor): libx264libx265 エンコーダーで使われる、推奨の画質指定方法です。レート制御をCRFモードに設定し、指定した品質レベルでエンコードを行います。

    • 値は通常、0から51の間の整数で指定します。
    • 値が小さいほど高画質になりますが、ファイルサイズは大きくなります。
    • 値が大きいほど低画質になりますが、ファイルサイズは小さくなります。
    • libx264 の場合、デフォルト値は23です。一般的に、18程度で「ほぼ可逆」と言われる高画質になり、30を超えると目に見えて画質が劣化します。実用的な範囲としては18から28あたりがよく使われます。例えば、高品質にしたいなら 20、ファイルサイズを抑えたいなら 2426 といった具合です。
    • libx265 の場合、CRFの値はlibx264と似た傾向ですが、同じ値でもlibx265の方が高画質になる傾向があります。
      “`bash

    CRFを20に設定して高品質なH.264動画を作成

    ffmpeg -framerate 10 -i image%04d.png -c:v libx264 -crf 20 output_high_quality.mp4

    CRFを26に設定してファイルサイズを抑えたH.264動画を作成

    ffmpeg -framerate 10 -i image%04d.png -c:v libx264 -crf 26 output_small_file.mp4
    “`
    特に画質にこだわりたい場合は、デフォルトの23よりも小さい値を試してみるのがおすすめです。

  • -q:v (Constant Quantizer): 古い方法ですが、一部のコーデックや特定用途では使われることがあります。各フレームの量子化パラメータを一定に保ちます。

    • 値は通常、0から31の間の整数で指定します。
    • 値が小さいほど高画質(可逆圧縮に近づく)になります。
    • 値が大きいほど低画質になります。
    • -crf とは逆の値の傾向になる点に注意してください(-crf小さい ほど高画質、-q:v小さい ほど高画質)。
    • libx264 など多くの現代的なエンコーダーでは -crf の使用が推奨されています。

通常は -crf を使えば十分です。まずは -crf 23 (デフォルト), -crf 20, -crf 26 あたりで試してみて、画質とファイルサイズのバランスを確認するのが良いでしょう。

3. ピクセルフォーマットの指定 (-pix_fmt)

動画ファイルは、色情報をどのように表現するかを示すピクセルフォーマットを持っています。ウェブや一般的なプレイヤーでの互換性を考えると、yuv420p を指定するのが最も安全です。これは、ほとんどのH.264エンコーダーのデフォルトでもありますが、明示的に指定しておくと間違いありません。

bash
ffmpeg -framerate 10 -i image%04d.png -c:v libx264 -pix_fmt yuv420p output.mp4

解説:

  • -pix_fmt yuv420p: 出力動画のピクセルフォーマットを yuv420p に指定します。YUVは輝度(Y)と色差(U, V)で色を表す方式で、人間の目が輝度により敏感であることを利用して色差情報を間引くことで効率的に圧縮します。420pはそのサンプリング方式を示し、水平方向と垂直方向ともに2×2のブロックで色差情報を共有します。これが最も一般的なフォーマットです。
  • なぜ指定するのか? 入力画像(PNG)は通常RGB形式です。動画(特にH.264など)ではYUV形式が一般的です。FFmpegは自動的に色空間変換を行いますが、明示的に yuv420p を指定することで、特に古い環境や一部のプレイヤーでの再生問題を避けることができます。また、一部のエンコーダー(例:ハードウェアエンコーダー)は特定のピクセルフォーマットしか受け付けない場合があります。

4. エンコーディングプリセットの指定 (-preset)

libx264libx265 のようなモダンなエンコーダーには、エンコード速度と圧縮率(ファイルサイズ)のトレードオフを調整するためのプリセットが用意されています。

  • -preset ultrafast, -superfast, -veryfast, -fast, -medium, -slow, -slower, -very慢, -placebo のような値があります。
  • 右に行くほどエンコードに時間はかかりますが、圧縮率が高くなり、同じ品質レベルであればファイルサイズが小さくなります。 (厳密には、-crf が同じであれば画質はほぼ同じで、圧縮効率が上がる=ファイルサイズが小さくなる)。
  • デフォルトは通常 medium です。
  • テストや手早く結果を確認したい場合は fastveryfast を、最終的な出力で可能な限りファイルサイズを小さく高品質にしたい場合は slowslower を選びます。placebo は極端に時間がかかり、得られる圧縮率の向上はわずかなため、通常は使いません。
    “`bash
    # fast プリセットで高速にH.264動画を作成
    ffmpeg -framerate 10 -i image%04d.png -c:v libx264 -preset fast output_fast.mp4

    slow プリセットで圧縮効率を高めてH.264動画を作成

    ffmpeg -framerate 10 -i image%04d.png -c:v libx264 -preset slow output_slow.mp4
    ``
    プリセットは
    -crfと組み合わせて使います。例えば、crf 20の高画質設定でも、-preset slow` を使うことでファイルサイズをより小さく抑えることができますが、エンコード時間は長くなります。

高品質な動画を作成するコマンド例(まとめ)

以上のオプションを組み合わせると、以下のようなコマンドで高品質なMP4動画を作成できます。

bash
ffmpeg -framerate 15 -i image%04d.png -c:v libx264 -pix_fmt yuv420p -crf 20 -preset slow output_high_quality.mp4

解説:

  • -framerate 15: フレームレートを15fpsに設定。タイムラプスや動きの少ないストップモーションなど。
  • -i image%04d.png: 入力画像シーケンス(image0001.pngから始まる4桁ゼロ埋めPNG)。
  • -c:v libx264: ビデオコーデックにH.264を指定。
  • -pix_fmt yuv420p: ピクセルフォーマットをyuv420pに指定(互換性のため)。
  • -crf 20: 画質設定をCRF 20に指定(デフォルト23より高品質)。
  • -preset slow: エンコードプリセットをslowに指定(エンコードに時間がかかるが、ファイルサイズをより小さくできる)。
  • output_high_quality.mp4: 出力ファイル名。

このコマンドは、見た目の画質を維持しつつ、ファイルサイズをある程度抑えたい場合に良いバランスの設定と言えます。ご自身の目的や画像の数、PCの性能に合わせて -framerate, -crf, -preset の値を調整してみてください。

画像のサイズやアスペクト比を調整する (-vf scale)

入力画像のサイズやアスペクト比がバラバラだったり、特定の解像度(例: 1920×1080)の動画を作成したい場合は、ビデオフィルターを使って画像をリサイズ(スケーリング)できます。これには -vf オプションを使います。

bash
ffmpeg -framerate 10 -i image%04d.png -c:v libx264 -pix_fmt yuv420p -crf 23 -vf scale=1280:-1 output_scaled.mp4

解説:

  • -vf scale=1280:-1: ビデオフィルターオプションです。scale はリサイズを行うフィルターです。
    • scale=width:height: 出力解像度を指定します。width に幅、height に高さをピクセル数で指定します。
    • scale=1280:-1: 幅を1280ピクセルに指定し、高さに -1 を指定しています。FFmpegでは、幅または高さのどちらかに -1 を指定すると、もう一方の値に合わせてアスペクト比を維持したまま自動的に計算してくれます。これは非常に便利です。この例では、幅1280ピクセルにリサイズし、高さは元の画像のアスペクト比を保つように自動で決定されます。
    • 逆に scale=-1:720 とすれば、高さを720ピクセルにし、幅をアスペクト比維持で自動計算します。
    • 元の画像より小さくすることも、大きくすることも可能です。ただし、画像を拡大しすぎると画質が劣化することがあります。
  • 複数のフィルターを使いたい場合は、カンマ , で区切って scale=...,format=... のように続けて記述します。例えば、リサイズと同時にピクセルフォーマットも指定するなら -vf "scale=1280:-1,format=yuv420p" のように記述できます。(ただし、-pix_fmtオプションとフィルターグラフのformatフィルターは基本的に同じことをするので、通常はどちらか一方でOKです)。

注意: リサイズフィルターは、エンコード処理の前に適用されます。リサイズ処理には追加の計算コストがかかるため、エンコード時間が少し長くなる可能性があります。

動画に音声を付ける

画像シーケンスだけでは無音の動画ができます。BGMなどの音声を付けたい場合は、別の音声ファイルを指定して動画に含めることができます。

bash
ffmpeg -framerate 10 -i image%04d.png -i audio.mp3 -c:v libx264 -pix_fmt yuv420p -crf 23 -c:a copy -shortest output_with_audio.mp4

解説:

  • -i audio.mp3: 2つ目の -i オプションで、音声ファイル(ここでは audio.mp3)を入力として指定します。MP3, AAC, WAVなど、FFmpegがサポートする様々な音声フォーマットが使用できます。
  • -c:a copy: オーディオコーデックを指定します。copy音声ストリームを再エンコードせずにそのままコピーすることを意味します。これにより、エンコード時間が短縮され、音質の劣化もありません。入力音声フォーマットが出力コンテナ(MP4)でサポートされている必要があります(MP4はAACやMP3をサポートしています)。もし入力音声がMP4でサポートされない形式だったり、音声にエフェクトをかけたい場合は、aac のような別のコーデックを指定する必要があります(例: -c:a aac -b:a 128k)。
  • -shortest: これが重要なオプションです。複数の入力(画像シーケンスと音声ファイル)がある場合、FFmpegはデフォルトで最も長い入力の長さに合わせようとします。-shortest オプションを付けると、最も短い入力の長さに合わせて出力が終了します。 通常、画像シーケンスよりもBGMの方が長いことがほとんどでしょうから、このオプションを付けることで、画像が終了した時点で動画も終了し、音声の終わりに合わせて動画が途中で切れるのを防ぎます。逆に、もし画像シーケンスの方が短い場合は、画像が終了した時点で動画は終了し、音声は途中でカットされます。

このコマンドで、画像と音声を結合したMP4動画が作成されます。

その他の便利なオプション

  • 開始フレームと終了フレームの指定: 画像シーケンスの一部だけを動画にしたい場合に使います。

    • -start_number: 連番の開始番号を指定します。
      bash
      # image0100.png から始まる画像を処理する場合
      ffmpeg -framerate 10 -start_number 100 -i image%04d.png output.mp4
    • -vframes: 処理する画像の枚数を指定します。
      bash
      # 最初の100枚の画像を処理する場合
      ffmpeg -framerate 10 -i image%04d.png -vframes 100 output.mp4
    • これらのオプションを組み合わせることも可能です。例えば、image0100.png から始めて50枚だけ処理するなら -start_number 100 -vframes 50 となります。
  • 出力ファイルの上書きを許可/禁止:

    • デフォルトでは、同名の出力ファイルが存在する場合、確認メッセージが表示されます。
    • -y: 確認メッセージなしで出力を上書きします。スクリプトなどで自動化する場合によく使います。
      bash
      ffmpeg -y -framerate 10 -i image%04d.png output.mp4 # 既存のoutput.mp4を上書き
    • -n: 同名の出力ファイルが存在する場合、エラーとして終了し、上書きしません。誤操作を防ぎたい場合に便利です。
      bash
      ffmpeg -n -framerate 10 -i image%04d.png output.mp4 # output.mp4が既に存在したらエラー

コマンド実行上の注意点とトラブルシューティング

  • ディレクトリの移動: コマンドを実行する前に、必ず画像ファイルが保存されているディレクトリにコマンドプロンプト/ターミナルで移動してください。ファイルパスをフルパスで指定することも可能ですが、ディレクトリ移動の方がコマンドがシンプルになります。
    bash
    # ファイルパスをフルパスで指定する例 (Windows)
    ffmpeg -framerate 10 -i "C:\Users\YourName\Pictures\MyImageSequence\image%04d.png" "C:\Users\YourName\Videos\output.mp4"

    ファイルパスにスペースが含まれる場合は、必ずダブルクォーテーション " で囲んでください。
  • 画像ファイルの存在確認: 指定したファイル名のパターン (image%04d.png など) で、少なくとも1つ以上のファイルが存在しないとエラーになります。また、開始番号がファイルと一致しているかも確認してください。
  • FFmpegコマンドが見つからない: 「コマンドが見つかりません」のようなエラーが出る場合は、FFmpegのインストールが正しく行われていないか、環境変数Pathが設定されていないか、設定してもコマンドプロンプト/ターミナルを再起動していない可能性があります。
  • 出力ファイルが作成されない/エラー終了:
    • 出力先のディレクトリに書き込み権限があるか確認してください。
    • 指定したコーデックやピクセルフォーマットがFFmpegのビルドで有効になっているか確認してください(通常、公式ビルドなら問題ありません)。
    • コマンドのオプションのスペルミスがないか確認してください。
    • FFmpegの出力メッセージをよく読み、エラーの原因を探ってください。エラーメッセージには、どのオプションが不正か、どのファイルが見つからないか、といったヒントが含まれています。
  • エンコードに時間がかかる:
    • 画像ファイルの解像度が高いほど、枚数が多いほど、フレームレートが高いほど、エンコード時間は長くなります。
    • -preset slow-slower を使うと、圧縮率は上がりますが、エンコード時間は大幅に長くなります。高速化したい場合は -preset fast-veryfast を試してください。
    • PCの性能(CPU、ストレージ速度)も影響します。
    • ハードウェアエンコーダー(GPUを使った高速エンコード)を利用することも可能ですが、これにはFFmpegのビルドやオプションが別途必要になり、少し高度な設定になります(例: -c:v h264_nvenc-c:v h264_ इंटेल_क्विकसिंक).
  • 生成された動画の画質が悪い、ファイルサイズが大きい:
    • -crf の値を調整してください。画質を上げたいなら値を小さく、ファイルサイズを小さくしたいなら値を大きくします。
    • -presetslowslower にすると、同じ -crf 値でもファイルサイズが小さくなる可能性があります(ただし時間はかかります)。
    • 入力画像自体の解像度や画質が低い場合、出力動画の画質もそれ以上にはなりません。
  • 画像のアスペクト比がおかしい: -vf scale-1 を使っているか、あるいは指定した解像度が元のアスペクト比と大きくかけ離れていないか確認してください。アスペクト比を無視して特定の解像度に強制リサイズすることも可能ですが、画像が歪みます(例: -vf scale=1920:1080,setsar=1)。

より高度な利用方法(概要)

この記事では「簡単」を主眼としているため、詳細は割愛しますが、FFmpegを使えば画像シーケンスから動画を作成する以外にも、様々な高度な処理が可能です。

  • トランジション効果の追加: 複数の画像シーケンス間にフェードイン・フェードアウトやワイプなどの効果を加える。これは複雑なフィルターグラフ (-vf) の記述が必要です。
  • テキストやオーバーレイ画像の追加: 動画の上に字幕を入れたり、ロゴ画像を重ねたりする。これも -vf drawtext-vf overlay などのフィルターを使います。
  • 特定時間の画像表示: 各画像ファイルを指定した時間だけ表示させたい場合。-loop 1 -t duration -i image.png のように、ループオプションと表示時間を組み合わせて個々の画像を処理し、それを連結する方法などが考えられます。これは複数のコマンドを組み合わせるか、複雑な入力を扱う必要があります。
  • 連番になっていない画像リストからの作成: ファイル名が不規則でリネームが難しい場合、テキストファイルに処理したい画像ファイルのリストを作成し、-f concat -safe 0 -i mylist.txt のような形式で入力として指定する方法もあります。
  • GIFアニメーションの作成: MP4ではなくGIFアニメーションとして出力することも可能です。エンコーディング設定がMP4とは異なります。
    bash
    # 例:PNGからGIFを作成 (パレット生成が必要)
    ffmpeg -framerate 10 -i image%04d.png -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif

    GIFは色の制限(通常256色)があるため、専用のパレット生成フィルターが必要です。

これらの応用的な使い方は、基本コマンドに慣れてから挑戦してみると良いでしょう。FFmpegの公式ドキュメントや、多くのオンラインリソースが参考になります。

まとめ:画像から動画作成コマンドのパターン

これで、複数のPNG画像からMP4動画を作成するための基本的な手順と、より高品質な動画を作成するための主要なオプションを理解できたはずです。

最も基本的なコマンドはこれでした。

bash
ffmpeg -framerate [フレームレート] -i [入力ファイルパターン] [出力ファイル名].mp4

例:

bash
ffmpeg -framerate 10 -i image%04d.png output.mp4

そして、高品質なH.264動画を作成するための推奨コマンドパターンは、以下のようになります。

bash
ffmpeg -framerate [フレームレート] -i [入力ファイルパターン] -c:v libx264 -pix_fmt yuv420p -crf [品質レベル] -preset [プリセット] [出力ファイル名].mp4

例:

bash
ffmpeg -framerate 15 -i image%04d.png -c:v libx264 -pix_fmt yuv420p -crf 20 -preset slow output_high_quality.mp4

さらに、音声ファイルを追加する場合は -i [音声ファイル] -c:a copy -shortest を加えます。

bash
ffmpeg -framerate 15 -i image%04d.png -i audio.mp3 -c:v libx264 -pix_fmt yuv420p -crf 20 -preset slow -c:a copy -shortest output_with_audio.mp4

画像のサイズを変更したい場合は -vf scale=幅:高さ を加えます。

bash
ffmpeg -framerate 15 -i image%04d.png -vf scale=1920:1080 -c:v libx264 -pix_fmt yuv420p -crf 20 -preset slow output_scaled.mp4

または、アスペクト比を維持して幅を1280pxにする場合:

bash
ffmpeg -framerate 15 -i image%04d.png -vf scale=1280:-1 -c:v libx264 -pix_fmt yuv420p -crf 20 -preset slow output_scaled_aspect.mp4

これらのコマンドをベースに、あなたの目的や画像の特性に合わせてオプションを調整してみてください。

終わりに

FFmpegを使った画像からの動画作成は、一度仕組みを理解すれば非常に効率的で柔軟な方法です。特に大量の画像を扱う場合や、定期的に同じ種類の動画を作成する場合にその威力を発揮します。

この記事で紹介したコマンドは、FFmpegの機能のほんの一端に過ぎません。しかし、ここまでの内容をマスターすれば、画像から動画への変換というタスクはもう難しくありません。コマンドラインへの抵抗が少しでも和らぎ、FFmpegの強力さを体感していただけたら幸いです。

まずは手元のいくつかの画像ファイルで試してみてください。そして、様々なオプションを試しながら、理想の動画作成に挑戦してみてください。

Happy FFmpeg’ing!


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール