FFmpegで動画ファイルからアニメーションGIFを作成する

toc目次

動画ファイルからアニメーション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(クロスハッチパターンがどの程度見えるか)を設定できます。

設定できる値は05で既定値は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で出力されます。

参考