ffmpegを使ってGIFアニメーションを作る方法
当ブログはMarkdownやMDX形式で文書を作成していますが、記事の中に動画を埋め込むのであれば、動画形式のファイルよりもGIFアニメーションに変換したほうが、アップロードや記事への埋め込みが楽にできます。
動画ファイルからGIFアニメーションへの変換はffmpegで簡単にできます。当記事では、ffmpegを使ってGIFアニメーションに変換するコマンドラインをまとめました。
ffmpegのインストール
Section titled “ffmpegのインストール”ffmpegをまだインストールしていないのであれば、まずはターミナル(コマンドプロンプトやシェル)でパッケージマネージャを使ってffmpegをインストールしてください。インストール後、ターミナルでffmpegコマンドが実行できることを確認してください。
Windowsの場合
Section titled “Windowsの場合”wingetコマンドを使ってインストールできます。詳細はこちらを参照してください。
winget install ffmpegmacOSの場合
Section titled “macOSの場合”Homebrewでインストールできることを確認しています。
brew install ffmpegLinuxの場合
Section titled “Linuxの場合”Ubuntuの場合はaptでインストールできます。
sudo apt install ffmpegffmpegでGIFアニメーションに変換する
Section titled “ffmpegでGIFアニメーションに変換する”オリジナルの動画ファイル名をinput.mp4、GIFアニメーションのファイル名をoutput.gifとします。
最も簡単に変換するだけのやり方は、以下のコマンドラインになります。-iで入力ファイル名を指定し、-yで既存の出力ファイルを上書き保存します。
ffmpeg -i input.mp4 -y output.gifこの方法では、画像の幅と高さ、及びフレーム数はオリジナルの動画と同じになるため、ファイルサイズは大きくなります。
画像の幅と高さを縮小する場合は、以下のように-vfを指定します。
-vfは-filter:vの別名で、ビデオストリームに一連のフィルターを適用します。
# 画像の幅は400ピクセル、高さは自動計算ffmpeg -i input.mp4 -vf "scale=400:-1" -y output.gif画像の高さを指定する場合。
# 画像の高さは400ピクセル、幅は自動計算ffmpeg -i input.mp4 -vf "scale=-1:400" -y output.gif動画のフレーム数を減らしたい場合は、以下のようになります。
# 動画のフレームレート(1秒あたりのフレーム数)を3にするffmpeg -i input.mp4 -vf "fps=3" -y output.gifフレーム数の削減と画像の縮小を行うのであれば、以下のようにカンマ(,)でつなぎます。
ffmpeg -i input.mp4 -vf "fps=3,scale=400:-1" -y output.gif高画質なGIFアニメーションを生成する
Section titled “高画質なGIFアニメーションを生成する”GIFアニメーションは色数が最大256色(1677万色中)のため、画質の低下が起こります。 高画質を保つために、カラーパレットを生成して適用するやり方があります。
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)
上記のコマンドラインでは、画像の縮小処理で画質を保つために、scaleのflags=lanczosで画像リサイズのアルゴリズムを指定しています。
splitでビデオストリームをs0とs1の2つに分けて、s0からカラーパレットを生成(palettegen)してpに渡し、s1とpを受けとってカラーパレットを適用(paletteuse)したGIFアニメーションを出力します。
以下はこのコマンドラインを使って生成した画面操作のGIFアニメーションです。9MB以上だった動画ファイルが380KB程度のGIFアニメーションに変換され、ブログ記事にも簡単に埋め込めるようになりました。