GitHubのコメントやQiitaの記事に動画を載せたいときなどに便利。
(Noisestorm - Crab Rave (Official Music Video) - YouTube)
基本
ffmpeg -i video.mp4 -vf "split[v1][v2];[v1]palettegen[p];[v2][p]paletteuse" video.gif
変換元の動画ファイル名を -i video.mp4
に指定、出力先のGIFファイル名を video.gif
に指定する。
-vf
オプションの中身はごちゃごちゃしているので気にしない。さくっと言うと、GIFは最大で256色までしか使えないので、一度動画全体の色分布を調べて一番綺麗に表現できる256色を選別している、というところ。上のCrab RaveのGIFでは、以下のようなパレットが作られている。
砂と蟹の色が際立っている。
FPS調整
GIF動画はファイルサイズが大きくなりがちなので、動画のなめらかさを犠牲にしてファイルサイズの削減をすることもできる。アップロード先にファイルサイズの制限があることはよくあるので、大事。
まず、元動画のFPSを ffprobe
を使って調べる。
ffprobe -hide_banner -i video.webm
コマンドの出力の中に、FPSが含まれている。例えば、
Input #0, matroska,webm, from 'video.webm':
Metadata:
encoder : google/video-file
Duration: 00:03:12.20, start: 0.000000, bitrate: 15813 kb/s
Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709), 3840x2160, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
の場合はFPSが30なので(最後の行に注目)、これを基準にして、減らす。
動きの激しい動画でない場合、FPS10程度でも十分だったりする。フレームの数が1/3になるので、ファイルサイズもおおよそ1/3になる。
ffmpeg -i video.mp4 -vf "fps=10,split[v1][v2];[v1]palettegen[p];[v2][p]paletteuse" video.gif
10 FPS/384x216/3.8s/1.9M | 30 FPS/384x216/3.8s/5.5Mb |
---|---|
解像度調整
ファイルサイズを削減する別手段として、動画の解像度を減らすこともできる。
まず、元動画の解像度を ffprobe
を使って調べる。
ffprobe -hide_banner -i video.webm
コマンドの出力の中に、解像度が含まれている。例えば、
Input #0, matroska,webm, from 'video.webm':
Metadata:
encoder : google/video-file
Duration: 00:03:12.20, start: 0.000000, bitrate: 15813 kb/s
Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709), 3840x2160, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
の場合は解像度が3840x2160なので(最後の行に注目)、これを基準にして、減らす。
アスペクト比を変えず、高さを216pxにする(384x216)場合、以下のコマンドを使う。
ffmpeg -i video.mp4 -vf "scale=-1:216:flags=lanczos,split[v1][v2];[v1]palettegen[p];[v2][p]paletteuse" video.gif
おまけ: GIF動画の各フレームをPNG画像として抽出する
まずは分かりやすいように出力用のディレクトリを作る。
mkdir frames
作成したディレクトリの中に、連番ファイル名のPNG画像(1.png
, 2.png
, ...)を出力する。
ffmpeg -i video.gif frames/%d.png