FFmpegで動画ファイルからアニメーションGIFを作成する
動画ファイルからアニメーションGIFを作成
FFmpegは、出力ファイルの拡張子を(.gif
)とすることで、動画ファイルからアニメーションGIFを作成できます。
動画ファイル(input.mp4
)からアニメーションGIF(output.gif
)を作成するには以下のコマンドを実行します。
ffmpeg -i input.mp4 output.gif
ただ、オプションを指定せずにアニメーションGIFを作成するとファイルサイズが大きくなるため、ビデオフィルター(-vf
オプション)でフレームレートや解像度を調整する必要があります。
フレームレートを10fps(fps=10
)、画像の横幅を320px(scale=320:-1
)でアニメーションGIFを作成するには以下のコマンドを実行します。
ffmpeg -i input.mp4 -vf "fps=10, scale=320:-1" output.gif
フレームレートや解像度以外のオプションについては、公式のドキュメントのVideo Filtersを参照ください。
アニメーションGIFのノイズを目立たなくする
アニメーションGIFの色数は最大256色までなので、変換する動画によっては減色によりノイズが目立つ場合があります。
ノイズが目立つ場合は動画ファイルからカスタムパレットを作成し適用することで、アニメーションGIFが綺麗になる場合があります。
カスタムパレットを生成し適用するには、-vf
オプションに以下を追加します。
split[a][b]; [a]palettegen[p]; [b][p]paletteuse
フレームレートを10fps(fps=10
)、カスタムパレットを生成し適用してアニメーションGIFを作成するには以下のコマンドを実行します。
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse" output.gif
その他オプション
ditherオプション
前述のコマンドでもノイズが目立つ場合は、dither
(減色処理)のアルゴリズムを変更することで改善する場合があります。
dither
オプションで指定できるアルゴリズムは以下の通り。
none
bayer
heckbert
floyd_steinberg
sierra2
sierra2_4a
(既定値)sierra3
burkes
atkinson
(参考:FFmpeg Filters Documentation)
どのアルゴリズムが適しているかは、動画の内容によって異なるため、dither
オプションを変更してアニメーションGIFを比較する必要があります。
以下、動画ファイル(input.mp4
)からdither
を変更したアニメーションGIFを一括で作成するコマンドです。
:: none
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=none" output_none.gif
:: bayer
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=bayer" output_bayer.gif
:: heckbert
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=heckbert" output_heckbert.gif
:: floyd_steinberg
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=floyd_steinberg" output_floyd_steinberg.gif
:: sierra2
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=sierra2" output_sierra2.gif
:: sierra2_4a
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=sierra2_4a" output_sierra2_4a.gif
:: sierra3
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=sierra3" output_sierra3.gif
:: burkes
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=burkes" output_burkes.gif
:: atkinson
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=atkinson" output_atkinson.gif
アニメーションGIFのファイル名はoutput_[dither].gif
で出力されます。
bayer_scaleオプション
dither
のアルゴリズムでbayer
を指定しているときは、追加でbayer_scale
(クロスハッチパターンがどの程度見えるか)を設定できます。
設定できる値は0
~5
で既定値は2
です。
以下、動画ファイル(input.mp4
)からbayer_scale
を変更したアニメーションGIFを一括で作成するコマンドです。
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=bayer:bayer_scale=0" output_bayer0.gif
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=bayer:bayer_scale=1" output_bayer1.gif
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=bayer:bayer_scale=2" output_bayer2.gif
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=bayer:bayer_scale=3" output_bayer3.gif
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=bayer:bayer_scale=4" output_bayer4.gif
ffmpeg -i input.mp4 -vf "fps=10, split[a][b]; [a]palettegen[p]; [b][p]paletteuse=dither=bayer:bayer_scale=5" output_bayer5.gif
アニメーションGIFのファイル名はoutput_bayer[bayer_scale].gif
で出力されます。