はじめに

この記事では、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

FFmpegで基本変換した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画像がこちら。

FFmpegで生成したpalette画像

この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

FFmpegのパレット機能で作った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%削減)へと圧縮できた。 見た目もそれほど変わらない。

gifsicleで圧縮したGIFアニメ

アニメ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.movinput.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

curljqを使った小さなシェルをほかにも見たい場合は、curlとjqで作る便利シェル集 も参考になる。