動画ファイルから GIF アニメーションを作るのを、ffmpeg のみで完結させます。
「コマンドの履歴まっさらでオプション忘れた」なんて時のメモ用に。
1. 動画の下ごしらえ
動画がフル HD であるなどの場合、そのまま GIF にしてしまうと膨大なサイズになってしまいます。そこで、ある程度ダウンスケールするなどの下ごしらえを行います。
時間切り取り
ffmpeg -ss START -to END -i "input.mp4" "output.mp4"
例: -ss 0:02 -to 0:04
-ss
で開始時間、-to
で終了時間を指定。
映像切り取り (トリミング, クロップ)
ffmpeg -i "input.mp4" -vf "crop=W:H:X:Y" "output.mp4"
例: crop=400:300:80:70
W:H
に出力の横:縦サイズ、X:Y
に切り取り矩形の左上端の座標を指定。
解像度変更 (スケール)
ffmpeg -i "input.mp4" -vf "scale=W:H" "output.mp4"
例: scale=640:-1
1辺の解像度を指定し、縦横比を維持してもう 1辺を指定したい場合、-1
を指定することで自動で解像度が決められます。
以下のページで、詳しい例と共に解説されています。
フレームレート変更
ffmpeg -i "input.mp4" -vf "fps=F" "output.mp4"
例: fps=20
用途にもよりますが、60fps はややオーバー。体感的には 30fps が上限かと思います。
備考 - 複数の効果を用いるには
ffmpeg -ss START -to END -i "input.mp4" -vf "crop=W:H:X:Y,scale=W:H,fps=F" "output.mp4"
-vf
の後の項目をコンマ ,
区切りで連続で書きます。(時間切り取りは -vf
と別のオプション)
ビデオフィルタ -vf
は、左から指定した順に適用されます。上の例では、トリミング後にスケール、最後にフレームレート変更という順で処理が行われます。
2. GIF に変換する
ffmpeg -i out.mp4 -vf "palettegen=stats_mode=diff" pal.png
ffmpeg -i out.mp4 -i pal.png -lavfi "paletteuse" out.gif
初めに 256色パレットを生成、その後にパレットを使用して動画から GIF を作成します。
GIF の仕様で、1画像 (正確には 1レイヤごと) に 256色しか使用することができません。これは、GIF が昔のフォーマットであることの名残です。
3. 後片付け
以上の手順における中間ファイルを削除します。
rm pal.png out.mp4
中間ファイルを作らずに進める方法もありますが、オプションを簡潔にするため中間ファイルを通すことにしました。中間ファイル無しで進めるには、本記事末尾に貼った記事を参照してみてください。
ちなみに
趣旨から離れるのであえて省きましたが、GIF の作成手順は他にもいくつかあります。キレイさを犠牲に最も手軽に作るなら、出力の拡張子を .gif
にしてやるだけでも OK です。
ffmpeg -i out.mp4 out.gif
こちらの記事で、実例と共に様々な最適化の試みをしてくださっています。高みを目指してチューニングしたい方は、試してみると良いかもしれません。