コンテンツにスキップ

ffmpegを使ってGIFアニメーションを作る方法

当ブログはMarkdownやMDX形式で文書を作成していますが、記事の中に動画を埋め込むのであれば、動画形式のファイルよりもGIFアニメーションに変換したほうが、アップロードや記事への埋め込みが楽にできます。

動画ファイルからGIFアニメーションへの変換はffmpegで簡単にできます。当記事では、ffmpegを使ってGIFアニメーションに変換するコマンドラインをまとめました。

ffmpegをまだインストールしていないのであれば、まずはターミナル(コマンドプロンプトやシェル)でパッケージマネージャを使ってffmpegをインストールしてください。インストール後、ターミナルでffmpegコマンドが実行できることを確認してください。

wingetコマンドを使ってインストールできます。詳細はこちらを参照してください。

Terminal window
winget install ffmpeg

Homebrewでインストールできることを確認しています。

Terminal window
brew install ffmpeg

Ubuntuの場合はaptでインストールできます。

Terminal window
sudo apt install ffmpeg

ffmpegでGIFアニメーションに変換する

Section titled “ffmpegでGIFアニメーションに変換する”

オリジナルの動画ファイル名をinput.mp4、GIFアニメーションのファイル名をoutput.gifとします。

最も簡単に変換するだけのやり方は、以下のコマンドラインになります。-iで入力ファイル名を指定し、-yで既存の出力ファイルを上書き保存します。

Terminal window
ffmpeg -i input.mp4 -y output.gif

この方法では、画像の幅と高さ、及びフレーム数はオリジナルの動画と同じになるため、ファイルサイズは大きくなります。

画像の幅と高さを縮小する場合は、以下のように-vfを指定します。 -vf-filter:vの別名で、ビデオストリームに一連のフィルターを適用します。

Terminal window
# 画像の幅は400ピクセル、高さは自動計算
ffmpeg -i input.mp4 -vf "scale=400:-1" -y output.gif

画像の高さを指定する場合。

Terminal window
# 画像の高さは400ピクセル、幅は自動計算
ffmpeg -i input.mp4 -vf "scale=-1:400" -y output.gif

動画のフレーム数を減らしたい場合は、以下のようになります。

Terminal window
# 動画のフレームレート(1秒あたりのフレーム数)を3にする
ffmpeg -i input.mp4 -vf "fps=3" -y output.gif

フレーム数の削減と画像の縮小を行うのであれば、以下のようにカンマ(,)でつなぎます。

Terminal window
ffmpeg -i input.mp4 -vf "fps=3,scale=400:-1" -y output.gif

高画質なGIFアニメーションを生成する

Section titled “高画質なGIFアニメーションを生成する”

GIFアニメーションは色数が最大256色(1677万色中)のため、画質の低下が起こります。 高画質を保つために、カラーパレットを生成して適用するやり方があります。

Terminal window
ffmpeg -i input.mp4 \
-vf "fps=3,scale=400:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
-y output.gif

コマンドラインでマークしている箇所を適宜書き換えます。

  • -iで入力ファイル名を指定する (例: -i input.mp4)
  • fpsでフレームレートを指定する (例: fps=3)
  • scaleで画像サイズを指定する (例: scale=400:-1)
  • 最後に出力ファイル名を指定する (例: output.gif)

上記のコマンドラインでは、画像の縮小処理で画質を保つために、scaleflags=lanczosで画像リサイズのアルゴリズムを指定しています。

splitでビデオストリームをs0s1の2つに分けて、s0からカラーパレットを生成(palettegen)してpに渡し、s1pを受けとってカラーパレットを適用(paletteuse)したGIFアニメーションを出力します。


以下はこのコマンドラインを使って生成した画面操作のGIFアニメーションです。9MB以上だった動画ファイルが380KB程度のGIFアニメーションに変換され、ブログ記事にも簡単に埋め込めるようになりました。