MP4 の短いループを GIF にするときは、先に切り出す長さ・幅・フレームレートを決め、同じ条件の映像からパレットを作ると調整しやすくなります。拡張子の変更では変換できません。ここでは手元にある動画から、共有用の短い GIF を作る手順を示します。
入力を短くしてからパレットを生成する
次の例は冒頭の 3 秒を使い、毎秒 12 フレーム、最大幅 480 ピクセルにします。FFmpeg が使えるシェルで実行します。入力は自分が使用できる input.mp4 に置き換えてください。
ffmpeg -y -t 3 -i input.mp4 -vf "fps=12,scale=w='min(480,iw)':h=-1:flags=lanczos,palettegen" -frames:v 1 palette.png
min(480,iw) により幅が小さい入力は拡大しません。高さの -1 は縦横比に合わせて計算させます。palettegen は映像の色をパレットにまとめるフィルターです。ここでは画像の細部を残すために全解像度を使うのではなく、実際に配布するサイズで色を選んでいます。
コマンドにある引用符は重要です。min の引数のカンマをフィルターの区切りとして解釈させないため、式を引用しています。シェルによって引用符の扱いが異なる場合は、まず FFmpeg のエラーに表示されるフィルター文字列を確認してください。
同じ変形を適用して GIF を書き出す
ffmpeg -y -t 3 -i input.mp4 -i palette.png -filter_complex "[0:v]fps=12,scale=w='min(480,iw)':h=-1:flags=lanczos[v];[v][1:v]paletteuse" -loop 0 output.gif
-t 3 は動画の -i より前に置き、入力を冒頭の3秒に制限しています。パレット生成前に映像を短くすることで、後ろの区間の色が混ざることを避けます。二つのコマンドで fps と scale を一致させています。二つ目だけ幅を変えると、パレットを選んだ条件と使用条件がずれます。色が多い動画ではディザによる粒状感が見えることもあるため、滑らかなグラデーションと文字の輪郭の両方を見て判断します。
-loop 0 は繰り返し再生する GIF を出力する指定です。再生アプリの挙動まで保証するものではないので、最終的に貼り付ける場所でも確認します。FFmpeg の各フィルターの仕様は 公式フィルター資料 で確認できます。
投稿から取得する段階と変換条件を分ける
X の公開投稿を起点にする場合、Twitter GIF Downloader のページでは、ループ MP4 と実際の GIF ファイルを区別して取得する方法を案内しています。本記事はこのツールの紹介目的で作成した技術メモです。上のコマンドはローカル変換の例であり、同ツールの内部実装を示したものではありません。
単に GIF が必要ならページ側で GIF 出力を選ぶ方法があります。一方、幅や長さを用途に合わせて細かく変更したい場合は、利用できる MP4 を手元で変換します。元の投稿 URL と出典は別途控え、公開されていることだけを理由に再配布の許可があると判断しないようにします。
サイズが大きければ長さから削る
GIF のファイルサイズは画面の内容にも左右されるため、幅とフレーム数だけで正確には予測できません。最初は次の順に調整すると、変更の意味を比較しやすくなります。
- 説明に必要な区間だけに短くします。待ち時間や同じ画面の繰り返しを取り除きます。
- 表示先の実際の幅まで縮小します。スマートフォンの小さな枠に載せるものを大きく書き出す必要はありません。
- 動きが読める範囲でフレームレートを下げます。カーソルや文字の切り替わりが飛んでいないか確認します。
ファイルを開けても、必要な文字が読めなければ資料として使えません。GIF の容量を削る目的で説明自体を失わないように、元の MP4 と並べて確認してください。