丁寧に手を抜く

頑張らない努力

ffmpegで動画を綺麗なgifに変換するコツ

先日、gifで動くモックアップ動画を作ってツイッターに投稿した。

英語でも同様のツイートをしたら以下のような質問が来た。

意訳: 「まじヌルヌル動くやん、どうやってんの?俺も前試してんけど無理やってんわー」

という訳でこちらにもティップスをシェアしたい。彼には既に伝えたので安心してほしい。

無料ツールのffmpegを使う

ffmpegというのは有名なフリーの動画変換CLIツール。一度知ったら手放せない。 macだったらhomebrewでインストールできる:

brew install ffmpeg

もっとも基本的な使い方は以下の通り:

ffmpeg -i input.mp4 output.gif

input.mp4output.gif に変換している。簡単や。

パラメータの調整が必要

しかし問題は、適切なパラメータを指定してやらないと綺麗に変換されないということだ。

以下は特に何も最適化せずに動画を変換した場合のアウトプット:

ffmpeg -i input.mov -lavfi "fps=12,scale=900:-1:flags=lanczos" -t 5 -y output.gif

f:id:craftzdog:20180713174417g:plain

  • fps=12, width=900, length=5s, size=445KB

なんかブツブツのパターンが見える。使えないこともないけどなんか違和感がある。

パレットを最適化する

gifは256色しか表示できない。なので、動画内で使われている色をあらかじめ計算してパレットを生成する。

ffmpeg -i input.mov -vf "palettegen" -y palette.png

これで palette.png というファイルが出来た。 このパレットファイルを使用して生成してみると・・

ffmpeg -i input.mov -i palette.png -lavfi "fps=12,scale=900:-1:flags=lanczos [x]; [x][1:v] paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" -y output.gif

f:id:craftzdog:20180713175101g:plain

  • fps=12, width=900, length=5s, size=1.3MB

スムース! あとはお好みのfps(フレームレート)やサイズを指定すればOK。 なぜファイルサイズが倍以上に増えたのかは、gifの仕様に詳しくないので分からない。

コマンド内で指定している謎の各パラメータはおまじないなので気にしなくてもOK。もしもっと凝った事がしたいなら、以下で紹介している参考元記事をどうぞ。

参考記事