【Mac】FFmpegで動画を綺麗なGIFに変換する

6 min

こんにちは。ナミレリです。今回はMacユーザー向けに強力で多機能なツールであるFFmpegを使用して、動画をGIFに変換する方法を紹介します。

基本的な変換から、高品質でカスタマイズされたGIFの作成までわかりやすく紹介したいと思います。

この記事はこんな人にオススメ

  • Macで動画からGIFを作成したいと思っている方
  • とにかくコマンドラインが大好きな方
  • FFmpegの基本的な使い方を知りたい方
この記事の環境
Parallelsの母艦
  • MacBook Pro 14インチ M1Max(メモリ32GB)
  • macOS Ventura 13.5
  • Parallels Desktop 18 for MacParallelsの公式サイト
  • ffmpeg version 6.0
ParallelsのゲストOS
  • macOS Ventura 13.5
  • ffmpeg version 6.0
Parallels Desktop 20 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。
NEW Parallels Desktop 20 for Mac

Parallels Desktop 20 for Macは、M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

14日間の無料トライアルもありますので、ぜひダウンロードして試してみてください。

FFmpegのインストール

早速、MacにFFmpegをインストールします。FFmpegは、動画と音声の変換、編集、ストリーミングなど、多岐にわたるメディア処理が可能なオープンソースのツールです。

brewをアップデートします


brew update && brew upgrade

FFmpegをインストールします


brew install ffmpeg

バージョンを確認します


ffmpeg -version

インストールは問題なく終了し、FFmpegのバージョン情報が表示されたと思います。これで、Mac上でFFmpegを使用する準備が整いました。

GIFへの変換(基本編)

FFmpegのインストールが完了したら、次は動画からGIFへの基本的な変換方法を見てみましょう。ここではシンプルな変換コマンドから始め、その後で各オプションの意味について解説します。

シンプルなGIF変換

最も基本的なGIF変換のコマンドは、下のようになります。


ffmpeg -i input.mov output.gif

コマンド説明
-i-iで入力ファイルとして、input.movを指定しています。
また、入力ファイルの後に、出力ファイルとしてoutput.gifを指定しています。

上記のコマンドは非常にシンプルですが、実際にGIFに変換する際は、サイズやフレームレートを指定して変換します。

サイズとフレームレーの指定

サイズとフレームレートを指定するには、下のようになります。


ffmpeg -i input.mov -vf "fps=15,scale=960:-1" output.gif

コマンド説明
-vf-vfでビデオフィルタを指定しています。ビデオフィルタの内容は
"fps=15,scale=960:-1"で、フレームレートを15に、幅を960ピクセルに
指定しています。

scale=960:-1-1は、高さの指定で、元の動画のアスペクト比(幅と高さの比率)が保持され、幅の指定(960ピクセル)を元に、高さが自動的に計算されます。

GIFへの変換(パレット編)

次に、パレットを生成しそれを使用して、品質の高いGIFに変換してみます。

GIFは256色までしかサポートされないため、動画から直接変換するとグラデーションなどのバンディングが生じることがあります。これを解決するためにパレットを使用します。

元動画に最適化されたパレットを生成し、そのパレットを使用してGIFをエンコードします。

パレットの生成


ffmpeg -i input.mov -vf "fps=15,scale=960:-1:flags=lanczos,palettegen" palette.png

コマンド説明
flags=lanczos,palettegenlanczosは、画像のリサンプリングの際に使用されるサンプリング法で、
リサイズの品質を向上させます。
palettegenは、動画から最適な256色のパレットを生成します。

生成したパレットを使用


ffmpeg -i input.mov -i palette.png -filter_complex "fps=15,scale=960:-1:flags=lanczos [x]; [x][1:v] paletteuse" output.gif

コマンド説明
-filter_complex複数のフィルターを接続してフィルターグラフを作成します。
[x]; [x][1:v]ffmpegのフィルターグラフの中で、
特定のフィルター処理の出力と入力をラベル付けして
接続するための構文です。

ザックリな説明としては下のようになります。
最初のフィルターがビデオをリサイズしてフレームレートを変更し、
その結果を[x]ラベルに保持し、
次のフィルター(paletteuse)は、[x]ラベルからの出力と
palette.pngからの入力([1:v])を受け取り、
これらを組み合わせて最終的なGIFを生成します。
  • [x]: 一時的なラベルで、フィルターの出力を一時的に保持するために使用されます。このラベルは次のフィルターへの入力として再利用できます。
  • [x][1:v]: この部分は、[x]ラベルからの出力とセカンド入力ビデオストリーム([1:v])を次のフィルターへの入力として結合します。

パレットありなしのGIF変換比較

下のGIFは、以前にQuickTimeで画面録画したものをGIFに変換したものです。Macのメモ.appでMacGPTを動かしている動画です。

ffmpegでパレットなしとパレットありでGIF変換してみました。パレットなしは縞々の線が入っていますが、パレットありは自然で綺麗なGIFに仕上がっています

パレットなし

GIF変換(パレットなし):縞々の線が入ってしまっている

パレットあり

GIF変換(パレットあり):自然で綺麗な仕上がり

GIFへの変換(パレット応用編)

これまで紹介した例では、パレットを生成するコマンドと生成したパレットでGIFに変換するコマンドを分けて紹介しましたが、1つにまとめることもできます。

少し複雑でパッと見て理解しにくいコマンドなので、パレット応用編として紹介します。

一度にパレットを生成しGIFに変換


ffmpeg -i input.mov -vf "fps=15,scale=960:-1:flags=lanczos,split[a][b]; [a]palettegen[c]; [b][c]paletteuse" output.gif

上記コマンドは、一時的なパレットファイルを作成せずにGIF変換を行うことができます。

splitを用いた複雑なフィルター構文の解説

上の「一度にパレットを生成しGIFに変換」コマンドで使用した、split[a][b]; [a]palettegen[c]; [b][c]paletteuseというフィルターの意味について紹介します。

コマンド説明
split[a][b]1. 入力ビデオストリームを2つに分割。
splitフィルターは、入力ストリームを複数に分割します。
例の場合は、元のビデオストリームを2つの[a][b]に分割します。
2つラベル([a][b])は、元のストリームと同じ内容です。
[a]palettegen[c]2. 一方のストリームから最適な色のパレットを生成。
ラベル[a]のビデオストリームからパレットを生成し、
新しいラベル[c]とします。
[b][c]paletteuse3. もう一方のストリームと生成したパレットでGIFに変換。
最後に、ラベル[b]のビデオストリームと[c]のパレットを組み合わせ、
paletteuseフィルターでGIFに変換します。

GIF作成のための応用テクニック

テキスト追加

テキストを追加してGIF生成するコマンドの例です。


ffmpeg -i input.mov -vf "drawtext=text='Your Text Here':fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2,fps=15,scale=640:-1:flags=lanczos" text_added.gif

オーバーレイ

適当な画像をオーバーレイ表示してGIF生成するコマンドの例です。


ffmpeg -i input.mov -i overlay.png -filter_complex "[0:v][1:v] overlay=W-w-10:H-h-10:format=auto, fps=15,scale=640:-1:flags=lanczos" overlay.gif

リバースエフェクト

リバースエフェクトでGIFを生成するコマンドの例です。


ffmpeg -i input.mov -vf "reverse,fps=15,scale=640:-1:flags=lanczos" reverse.gif

再生速度(スローモーション、高速化)

生成速度を速くしたり遅くしてGIFを生成するコマンドの例です。

スローモーション(2倍遅く)


ffmpeg -i input.mov -vf "setpts=2.0*PTS,fps=15,scale=640:-1:flags=lanczos" slowmotion.gif

高速化(2倍速く)


ffmpeg -i input.mov -vf "setpts=0.5*PTS,fps=15,scale=640:-1:flags=lanczos" fast.gif

フェードイン・フェードアウト

フェードインとフェードアウト効果でGIFを生成するコマンドの例です。


ffmpeg -i input.mov -vf "fade=in:0:30,fade=out:90:30,fps=15,scale=640:-1:flags=lanczos" fade.gif

ビネット効果

ビネット効果(周辺部を暗くして中心に焦点を当てる効果)でGIFを生成するコマンドの例です。


ffmpeg -i input.mov -vf "vignette=PI/4,fps=15,scale=640:-1:flags=lanczos" vignette.gif

カラフルな効果

カラフルな効果(色相を時間に応じて変化させる)でGIFを生成するコマンドの例です。


ffmpeg -i input.mov -vf "hue=H=2*PI*t,fps=15,scale=640:-1:flags=lanczos" hue_rotate.gif

クロップとパディング

特定の部分を強調するためにクロップする、またはパディングを追加してサイズを調整することも可能です。

クロップ


ffmpeg -i input.mov -vf "crop=in_w/2:in_h/2" output_cropped.gif

パディング


ffmpeg -i input.mov -vf "pad=width=800:height=600:x=80:y=60" output_padded.gif


ffmpeg -i input.mov -vf "pad=width=in_w+80:height=in_h+80:x=0:y=0" output_padded.gif

最後に

最後まで読んでいただきありがとうございます。FFmpegで動画を綺麗なGIFに変換するはいかがでしたでしょうか。今回はGIFの変換にフォーカスしましたが、ffmpegは動画と音声の変換、編集、ストリーミングなど、多岐にわたるメディア処理が可能です。ffmpegのコマンドラインの理解は、膨大なオプションやフィルタがあり難解ですがぜひチャレンジしてみてください。

macのオススメ初期設定の紹介

macを綺麗に保つお手入れ方法を紹介

HHKBをMacで使う

カテゴリー:
関連記事