はじめに
この記事では、iPhoneで録画した動画ファイルを、FFmpegでGIFアニメーションに変換する方法を解説する。
パレット機能で見た目を整え、gifsicleでファイルサイズを小さくするところまで扱う。
最後に、GitHubで公開しているスクリプトをcurl経由でその場実行する方法も紹介する。
なお、macOSにbrewを使ってFFmpegがインストールされているものとする。
FFmpegでGIFアニメの基本の作り方
iPhoneで録画した動画ファイルをinput.movとして用意した。動画のファイルサイズは5.3 MB。
FFmpegを使って、動画ファイルをGIFアニメに変換するコマンドがこちら。横幅を320pxに収めるため、アスペクト比を保ちながら変換した。フレームレートは15fps。
ffmpeg -i input.mov -vf scale=320:-1 -r 15 output.gif

ご覧の通り、画像がざらざらしていて、決してキレイとは言えない。GIFアニメのファイルサイズは約288 KB。
次では、もうひと手間かけて画像をキレイにする方法を紹介する。
FFmpegでGIFアニメをキレイに作る方法
FFmpegでGIFアニメをキレイに作るには、パレット機能を使う。次のコマンドで動画ファイルから色彩情報を抽出したpalette.pngを作成する。
ffmpeg -i input.mov -vf fps=15,scale=320:-1:flags=lanczos,palettegen palette.png
生成されたpalette.png画像がこちら。

このpalette.pngを元に動画を変換する。
ffmpeg -i input.mov -i palette.png -filter_complex "fps=15,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif

だいぶキレイなGIFアニメを作ることができた。しかし、ファイルサイズは約786 KBで、最初のGIF画像の3倍弱の容量になってしまった。そこでこのファイルサイズを小さくする方法を次の項で紹介する。
GIFアニメのファイルサイズを小さくする方法
ここでは、GIFアニメのファイルサイズを小さくするために、gifsicleを使ってコマンドラインで圧縮する方法を紹介する。
gifsicleは、GIFをコマンドラインで編集できるツールだ。brewを使ってインストールする。
brew install gifsicle
Gifsicleの詳細はこちら。
使い方は、次のとおり。
gifsicle -O3 --colors=128 --lossy=30 output.gif -o output_compressed.gif
lossyの値を増やしていくとファイルサイズが小さくなる。
この結果、ファイルサイズを約786 KBから約369 KB(約53%削減)へと圧縮できた。 見た目もそれほど変わらない。

アニメGIF作成のシェルスクリプト
ここまでのコマンドを毎回入力するのは面倒なので、シェルスクリプト化してみた。
使い方は、$ ./gif_anime.sh 動画ファイルで引数に動画のパスを渡す。すると、動画ファイルのディレクトリ上にanime.gifの名前でGIFアニメが保存される。
#!/bin/bash
input=$1
output=$(dirname ${input})/anime.gif
tmp=$(dirname ${input})/tmp.gif
echo $output
ffmpeg -i $input -vf fps=15,scale=320:-1:flags=lanczos,palettegen palette.png
ffmpeg -i $input -i palette.png -filter_complex "fps=15,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" $tmp
gifsicle -O3 --colors=128 --lossy=30 $tmp -o $output
rm -rf palette.png
rm -rf $tmp
同じ考え方のスクリプトは、GitHubのshell-toolbox
でも公開している。
手元にスクリプトを保存せず、その場で実行したい場合は、次のようにcurlで取得した内容をbashへ渡す。
curl -fsSL https://raw.githubusercontent.com/aragig/shell-toolbox/refs/heads/main/gifanime/gifanime.sh | bash -s -- input.mov
bash -s -- input.movのinput.movが、スクリプト内の$1として渡される。
処理が終わると、入力ファイルと同じディレクトリにanime.gifが作られる。
ただし、curl | bashは取得したスクリプトをそのまま実行する方法なので、初回は中身を確認してから実行した方がよい。
確認してから実行する場合は、次のように一度ファイルとして保存する。
curl -fsSL https://raw.githubusercontent.com/aragig/shell-toolbox/refs/heads/main/gifanime/gifanime.sh -o gifanime.sh
less gifanime.sh
bash gifanime.sh input.mov
curlやjqを使った小さなシェルをほかにも見たい場合は、curlとjqで作る便利シェル集
も参考になる。