1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ffmpegで動画をGIFに変換するレシピ集

Last updated at Posted at 2020-11-04

GitHubのコメントやQiitaの記事に動画を載せたいときなどに便利。

crab-fps10.gif
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では、以下のようなパレットが作られている。

palette.png

砂と蟹の色が際立っている。

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
crab-fps10.gif crab-fps30.gif

解像度調整

ファイルサイズを削減する別手段として、動画の解像度を減らすこともできる。

まず、元動画の解像度を 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

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?