FFmpegを使って動画をGIFへ変換する

ここではFFmpegを使ってMOV動画をGIFアニメーションへ変換する方法を紹介する. MacではQuickTimeをスクリーンキャプチャとして利用出来るが,得られる動画形式はMOVのみである. FFmpegを使ってGIFアニメーションへ最適化することでWebへの埋め込みも楽になる.

私の環境

  • Mac OS X El Capitan 10.11.3
  • Homebrew 0.9.5
  • FFmpeg 2.8.6
FFmpeg Documentation Video Options
動画のままのフレームレートでGIFアニメーションへ変換すると,とてつもなく大きなファイルサイズになってしまう. そのためGIFへの最適化は必須の作業となる. まずは,FFmpegのドキュメンテーションを参考にピクセルフォーマットをRGB8へ変換,フレームレートを10fpsへ削減したGIFを生成する.
ffmpeg -i input.mov -pix_fmt rgb8 -r 10 output.gif
-pix_fmtに続けてrgb8と指定することでピクセルフォーマットを変換できる. また-rに続けてフレームレートをfpsで指定できる. -pix_fmtは指定しなくともFFmpegが勝手に判断しRGB8へ変換してくれるが,ここは気持ちの問題である. 出力するGIFの大きさをピクセル数で指定することもできる.
ffmpeg -i input.mov -pix_fmt rgb8 -r 10 -s 320x240 output.gif
-sに続けて"横x縦"のピクセル数を指定できる. 上の場合,出力されるGIFは横320ピクセル,縦240ピクセルとなる. ただし,この場合アスペクト比は保たれないので使い勝手が悪い. そこでアスペクト比を保ったまま縦横のピクセル数を半分に縮小する方法を次に記す.
ffmpeg -i input.mov -pix_fmt rgb8 -r 10 -vf scale=iw/2:ih/2 output.gif
-vfオプションはフィルタを指定するオプションである. scaleフィルタに横:縦の比を指定している. "iw"は入力ファイルの横ピクセル数,"ih"は入力ファイルの縦ピクセル数であり,それを2で割っている. この"/"は割り算を意味する. もし,横:縦のピクセル数を2/3に縮小したい場合は"scale=iw*2/3:ih*2/3"と書くことも出来る. お察しの通り"*"は掛け算である. せっかくなのでもうひとつ. 録画した動画は16:9だが,録画内容は4:3なので両サイドに黒帯がある場合,cropフィルタを使うことでGIFを4:3へと変換できる.
ffmpeg -i input.mov -pix_fmt rgb8 -r 10 -vf crop=ih*4/3:ih output.gif
"ih"は入力ファイルの縦ピクセル数なので,出力ファイルの横ピクセル数をその4/3倍にすることで,出力ファイルのアスペクト比を4:3にしている. これで両サイドにあった黒帯をクロップ(切り取り)できた. 上にあるGIFアニメーションはまさにこのコマンドで生成したものになる. FFmpeg,恐るべし!
Animation Optimization | Image Magick 出力したGIFファイルは意外とファイルサイズが大きい. そこでImageMagickを利用してファイルサイズの削減を試みた. ファイルサイズを削減する方法は次の通り.
convert -layers Optimize input.gif output.gif
-layersオプションはGIFアニメーションのように,いくつもの画像が集まったファイルを扱う時に指定する. OptimizeオプションでGIFファイルの最適化が行われる. 映像の種類によっては元のファイルサイズの方が小さい場合もあるが,上手く行くとかなりファイルサイズを削減できるので,試す価値はあるだろう.
あるいは次のようなオンラインサービスを利用するのも良い.
4081812608286467361 http://www.storange.jp/2016/02/ffmpeggif.html http://www.storange.jp/2016/02/ffmpeggif.html FFmpegを使って動画をGIFへ変換する 2016-02-20T10:00:00+09:00 http://www.storange.jp/2016/02/ffmpeggif.html Hideyuki Tabata 200 200 72 72