【FFmpeg】MP4ファイルからGIFファイルを作る

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【FFmpeg】MP4ファイルからGIFファイルを作る

2022-2-15 | ,

FFmpegを使ってMP4ファイルからGIFファイルを作りたい!

概要

FFmpegとBacthを使ってMP4ファイルからGIFファイルを作る例を示す。

仕様書

batファイルに変換したいMP4、または、MP4が保管されたディレクトリをドラッグ・アンド・ドロップするとmp4ファイルがGIFファイルに逐一変換される。

環境

  • Windows 10 Home Version 21H1(OS ビルド 19043.1415)
  • FFmpeg 4.2

手順書

下記は、引数で渡されたファイルをGIFに変換するサンプルです。

@echo off

:loop

if "%~1" == "" goto end

set attr=%~a1

if exist %~1 (
    if %attr:~0,1%==d (
        for /r %~1 %%f in (*.mp4) do (
            call:mp4togif "%%f"
        )
    ) else if %attr:~0,1%==- call:mp4togif "%~1"
)

shift
goto loop

:end

pause

exit /b

:mp4togif

ffmpeg -y -i %1 -r 10 -vf scale=640:-1 -f gif %~n1.gif

exit /b

上記のBatchファイルを実行する前にffmpeg.exeがあるディレクトリにパスを通しておく。もしくは、Batchファイル内のffmpegコマンドをフルパスで入力しておく。

作ったbatファイルに変換したいMP4ファイルをまとめてドラッグ・アンド・ドロップすると処理が逐一開始される。

解説

ffmpegコマンドのオプションについて簡単に解説する。

-r 15は出力するgifファイルのフレームレートを設定する。

-vf scale=640:-1は出力するgifファイルのスケールを設定する。この例では、横幅を640px、縦幅は元のmp4ファイルのアスペクト比が保持されるように自動的に計算される。

その他のオプション

下記は-filter_complexを使い、変換の設定をまとめていろいろやっちゃうサンプルです。主にパレット関連の設定を変えて数パターンの例を示す。

グローバルパレットを作成し最適化する

グローバルパレットを作成してGIFファイルを作成する例です。
グローバルパレットは全フレームの画像を考慮してパレットが作られます。
画像のノイズを抑制しつつ、ファイルサイズを縮小する。ただし、全フレームを通して色数が多い動画に対しては、汚い動画になりがち。

ffmpeg -y -i %1 -filter_complex "[0:v] fps=10,scale=640:-1,split [a][b];[a] palettegen [p];[b][p] paletteuse" %~n1.gif

以下は他のサンプルと共通のオプションで主なものについて説明する。

fps=10-r 10と同様に出力するGIF動画のフレームレートを設定する。
scale=640:-1-vf scale=640:-1と同様に出力するGIF動画の大きさを設定する。

フレーム毎にパレットを作成し最適化する

フレーム毎にパレットを作成してGIFファイルを作成する例です。
フレーム毎にパレットが作成されるので、ファイルサイズは大きくなりがち。その代わりにフレーム毎の色を持てるのでグローバルパレットを使う場合より綺麗な動画が作成されやすい。

ffmpeg -y -i %1 -filter_complex "[0:v] fps=10,scale=640:-1,split [a][b];[a] palettegen=stats_mode=single [p];[b][p] paletteuse=new=1" %~n1.gi

グローバルパレット+ディザリングなし

グローバルパレットを作成して、尚且、ディザリング処理をせずにGIFファイルを作成する例です。
ディザリングとは、あえて少しノイズを加えることによって、出力する画像を綺麗にする処理です。画像だけではなく音声でも使われる技術です。
たぶん、ディザリング処理をしないことで色数を減らしてるのだと思う。

元の動画によるんですが、グローバルパレットのみの場合よりもファイルサイズが小さくなったり、出力されるGIF動画が綺麗になったりする。

ffmpeg -y -i %1 -filter_complex [0:v] fps=10,scale=640:-1,split [a][b];[a] palettegen [p];[b][p] paletteuse=dither=none %~n1.gif

まとめ(感想文)

この3パターンのオプションで出力してみて、ファイルサイズ、画質を比較して、選定するのが良いと思ふ。

ブログの素材用のGIF動画を作るのに便利かもね!