ffmpegを使って動画をGIFに変換するにはどうすればいいですか?

ffmpeg gif

私は動画をffmpegでGIFファイルに変換しています

ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif

これは素晴らしい動作をしますが、出力されるGIFファイルは非常に低い品質を持っています

変換されたGIFの品質を向上させる方法があれば教えてください

  408  Kamil Hismatullin  2013-02-22


ベストアンサー

ffmpeg example

GIF output from ffmpeg 183k

ffmpegは高品質のGIFを出力することができます。始める前に、常に最新のバージョンを使用することをお勧めします。ダウンロード または コンパイル

ffmpeg -ss 30 -t 3 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
  • この例では、入力の最初の30秒(-ss 30)をスキップし、3秒の出力(-t 3)を作成します
  • fps フィルタはフレームレートを設定します。この例では毎秒10フレームのレートを使用しています
  • スケーリング フィルタは、出力のサイズを 320 ピクセル幅に変更し、アスペクト比を維持したまま高さを自動的に決定します。この例では、スケーリングアルゴリズムを使用しています
  • palettegenpaletteuse フィルタは、入力から生成されたカスタムパレットを生成して使用します。これらのフィルターには多くのオプションがありますので、 利用可能なすべてのオプションと値の一覧はリンク先を参照してください。下記の高度なオプションの項も参照してください
  • split フィルタを使うと、すべてを一つのコマンドで行うことができ、パレットの一時的な PNG ファイルを作成する必要がなくなります
  • -loop出力オプションでループを制御しますが、値が混乱しています。0の値は無限ループ、-1はループしない、1は1回ループする、つまり2回再生される。つまり、値が10だとGIFは11回再生されることになります

Advanced options

palettegenpaletteuse フィルタには多くのオプションがあります。最も重要なものは以下の通りです

  • stats_mode (palettegen)。フィルタは、パレットを一般的な画像 (full がデフォルト)、可動部分のみ (diff)、または個々のフレーム (single) に強制的にフォーカスさせることができます。例えば、個々のフレームのパレットを生成するには palettegen=stats_mode=single & paletteuse=new=1 を使います

  • dither (paletteuse)。ディザリングアルゴリズムを選択します。主に3つのタイプがあります: 決定論的 (bayer)、誤差拡散 (デフォルトの sierra2_4a を含む他のすべてのタイプ)、そして何もしない。あなたの GIF は、特定のディザリングアルゴリズムを使った方がよく見えるかもしれませんし、ディザリングを全く使わない方がよく見えるかもしれません。もし bayer を試したいのであれば、bayer_scale オプションも試してみてください

FFmpeg を使った高品質 GIF の説明、画像の例、高度な使い方の詳細については、を参照してください

また、利用可能なすべてのオプションと値については、palettegenpaletteuse のドキュメントを参照してください


ImageMagick convertの例

GIF output from ffmpeg 227k

もう一つのコマンドラインの方法は、ImageMagick から ffmpeg から convert (または magick) にパイプすることです

 ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v pam -f image2pipe - | convert -delay 10 - -loop 0 -layers optimize output.gif

ffmpeg options:

  • -vf "fps=10,scale=320:-1:flags=lanczos" filtergraphfpsscale のフィルタを使用しています。この例では、スケーリングアルゴリズムのlanczosを使用しています

  • -c:v pam pam 画像エンコーダを選択します。この例では、PAM (Portable AnyMap) 画像フォーマットを出力していますが、これは透明度 (アルファ) をサポートしており、convertでサポートされているシンプルでロスレスな RGB フォーマットです。PNGよりも高速にエンコードできます

  • -f image2pipe は image2pipe muxer を選択していますが、これはパイプに出力する際に ffmpeg にどの muxer を使うかを指示する必要があるからです

convert options:

  • -delay 下記の「フレームレートの設定」の項を参照してください

  • -loop 0は無限ループを作る

  • -layers optimize 汎用GIFオプティマイザを有効にします。詳細は ImageMagick Animation Optimization を参照してください。より小さな出力が得られることを保証するものではありませんので、-layers optimizeを使わずに試してみて結果を比較してみる価値はあります

フレームレートの設定

fps filter in ffmpeg and -delayconvertの組み合わせでフレームレートを設定します。convertは画像の生のストリームを取得するだけなので、fpsは保持されないので、これは複雑になるかもしれません。第二に、convert-delayの値は、1秒あたりのフレーム数ではなく、1秒あたり100ティック(1秒あたり100ティック)です。例えば、fps=12.5 = 100/12.5 = 8 = -delay 8とすると、fps=12.5は100/12.5 = 8 = -delay 8となります

convert-delayの値を整数に丸めるので、8.4は8、8.5は9になります。これは、すべてのフレームに一様な遅延を設定する場合、一部のフレームレートのみがサポートされていることを意味します(フレームごとに特定の遅延を設定することができますが、それはこの答えの範疇を超えています)

-delayは出力オプションとして使用されると無視されるように見えるので、例のように-の前に使用しなければなりません

最後に、ブラウザや画像ビューアは最小遅延を実装している場合がありますので、-delayはいずれにせよ無視される可能性があります

ビデオ提供:U.S. Fish & Wildlife Service National Conservation Training Center.

627  llogan  2013-02-22


中間のイメージファイルを避けたい場合は、LordNeckBeardが提供するコマンドをffmpegとImageMagickのconvertの間にパイプすることで、中間ファイルを必要としないようにすることができます

ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - output.gif

-f image2pipeは映像を映像に分割してパイプ出力するように指示し、-vcodec ppmは出力フォーマットをppmに指定します(フォーマットがpngの場合、なぜかconvertはパイプから全ての映像を読み込まないか、もしくは全ての映像を出力しません)。両方のコマンドの - は、出力と入力にそれぞれパイプを使うことを指定しています

ファイルを保存せずに結果を最適化するには、convertからの出力を2つ目のconvertコマンドにパイプすることができます

ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - gif:- | convert -layers Optimize - output.gif

gif:-convert に出力を gif フォーマットのデータとしてパイプするように指示し、-layers Optimize は 2 番目の convertoptimize-frameoptimize-transparancy メソッドを実行するように指示します (ImageMagick アニメーション最適化入門 を参照してください)。-layers Optimize からの出力は常により小さなファイルサイズを提供するとは限らないことに注意してください

この全体のプロセスの間、すべてのものがメモリ内にあることを覚えておいて、画像がかなり大きい場合は十分なメモリが必要になるかもしれません

92  notedible  2014-03-18


ffmpeg 2.6の時点で、私たちはさらに良いことができます

palette="/tmp/palette.png"
filters="fps=15,scale=320:-1:flags=lanczos"

ffmpeg -i input.flv -vf "$filters,palettegen" -y $palette
ffmpeg -i input.flv -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y output.gif

HT

39  pje  2015-03-23


出力解像度やフレームレートもパラメータ化したスクリプトを自作してみました

./gifenc.sh input.mov output.gif 720 10を実行すると、与えた動画から720p幅10fpsのGIFが出力されます。ファイルに対してchmod +x gifenc.shを実行する必要があるかもしれません

#!/bin/sh

palette="/tmp/palette.png"

filters="fps=$4,scale=$3:-1:flags=lanczos"

ffmpeg -v warning -i "$1" -vf "$filters,palettegen" -y "$palette"
ffmpeg -v warning -i "$1" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$2"

詳細は私のGithubで読むことができます

前提条件: ffmpegがインストールされており、スクリプトは他のファイルと同じフォルダにある

24  thevangelist  2015-07-12


ステファンさんの回答は非常に良いですね。しかし、いくつかの動画に対してBuffer queue overflow, dropping.のような警告が出て、生成されたgifにはフレーム落ちがあります

fifo フィルタを使って paletteuse フィルタを使うときに Buffer queue overflow を避けるために fifo フィルタを使ったより良いバージョンは以下の通りです。split フィルタを使うことで中間パレット PNG ファイルの生成を避けることができます

ffmpeg -i input.mp4 -filter_complex 'fps=10,scale=320:-1:flags=lanczos,split [o1] [o2];[o1] palettegen [p]; [o2] fifo [o3];[o3] [p] paletteuse' out.gif

20  alijandro  2017-10-05


パレット付きmethodffmpegは、中間の.pngファイルを介さずに、1つのコマンドで実行できます

ffmpeg -y -ss 30 -t 3 -i input.flv -filter_complex \
"fps=10,scale=320:-1:flags=lanczos[x];[x]split[x1][x2]; \
[x1]palettegen[p];[x2][p]paletteuse" output.gif

これは split フィルタのおかげで可能です

13  Stephane  2017-09-30


Linux/Unix/macOS

@LordNeckbeard のアプローチffmpeg コマンドで実行した後、~/.bash_profile ファイルに追加できる以下の便利な Bash 関数を見つけてください

# Convert video to gif file.
# Usage: video2gif video_file (scale) (fps)
video2gif() {
ffmpeg -y -i "${1}" -vf fps=${3:-10},scale=${2:-320}:-1:flags=lanczos,palettegen "${1}.png"
ffmpeg -i "${1}" -i "${1}.png" -filter_complex "fps=${3:-10},scale=${2:-320}:-1:flags=lanczos[x];[x][1:v]paletteuse" "${1}".gif
rm "${1}.png"
}

関数がロードされると(手動または. ~/.bash_profileから)、新しいvideo2gifコマンドが作成されます

Example usage:

video2gif input.flv

or:

video2gif input.flv 320 10

秒間10フレームで320幅にスケールします

また、別のビデオフォーマット(mp4など)を指定することもできます


macOS

あなたは動画ファイルからGIFを作成することができますGIF醸造所アプリを試すことができます


また、無料でオンライン変換を行っているいくつかのウェブサイトがあります

13  kenorb  2016-12-09


選択された答えは、ソースビデオを拡大縮小し、生成されたGIFでそのfpsを変更したいと仮定しています。これを行う必要がない場合は、次のように動作します

src="input.flv"
dest="output.gif"
palette="/tmp/palette.png"

ffmpeg -i $src -vf palettegen -y $palette
ffmpeg -i $src -i $palette -lavfi paletteuse -y $dest

これは、私が使用しているソースビデオを忠実に再現したGIFが欲しいときに便利でした

12  Jet Blue  2017-11-14


スクリプトを作り、テストし、動作させました

usage:

./avi2gif.sh ./vokoscreen-2015-05-28_12-41-56.avi

HAVE PHUN 🙂

vim avi2gif.sh

#!/bin/sh

INPUT=$1

# default settings, modify if you want.

START_AT_SECOND=0; # in seconds, if you want to skip the first 30 seconds put 30 here

LENGTH_OF_GIF_VIDEO=9999999; # in seconds, how long the gif animation should be

echo "Generate a palette:"
ffmpeg -y -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png

echo "Output the GIF using the palette:"
ffmpeg -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -i palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" $INPUT.gif

btwtw: vokoscreen は Linux 用の優れたスクリーンキャプチャツールです。)

ありがとうございます マイケル・コハウプト :)ロックステディ

いくつかのファイルサイズの統計

5.3M = vokoscreen-2015-04-28_15-43-17.avi -> vokoscreen-2015-05-28_12-41-56.avi.gif = 1013K

結果はこちら

11  canoodle  2015-05-28


Windowsユーザの場合:これらの内容を含むvideo2gif.batファイルをwindowsディレクトリに作成してください

@echo off
set arg1=%1
set arg2=%arg1:~0,-4%
ffmpeg -y -i %arg1% -vf fps=10,scale=-1:-1:flags=lanczos,palettegen %TEMP%\palette.png
ffmpeg -i %arg1% -i %TEMP%\palette.png -filter_complex "fps=10,scale=-1:-1:flags=lanczos[x];[x][1:v]paletteuse" %arg2%.gif
del /f %TEMP%\palette.png

そして、それを使うことができる場所は、この例のようになります

video2gif myvideo.mp4

ということは、カレントディレクトリにmyvideo.gifがあるということになります。 もし、myvideo.gifが存在する場合は、それを上書きするかどうか質問してください

EDIT:

私はこのバッチスクリプトを使用することをお勧めします。https://github.com/NabiKAZ/video2gif

6  Nabi K.A.Z.  2017-04-21


動画ファイルをGIFに変換するためにwindows 7/10の「右クリック」コンテキストメニューエントリを追加する方法

他の回答の中には、video2gif スクリプトを挙げているものがありますが、これは私が使ったものです。しかし、どのようなスクリプトを使っても構いません

コンテキストメニューオプションを作成するには、レジストリを編集する必要があります。管理者権限で実行している powershell コマンドプロンプトを開きます。以下のコマンドを実行してください

$key = "Registry::HKEY_CLASSES_ROOT\`*\shell\Run Video2Gif"
New-Item -Path $key"\Command" -Value "C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat `"%1`"" -Force

ファイルを右クリックすると、”Video2Gifの実行 “オプションが表示されます

btw 私はffmpegをC:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\にインストールし、video2gif.batスクリプトをffmpeg.exeのすぐ隣のbinディレクトリに入れました。また、私のウィンドウズのPATHにもC:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\binを追加しましたが、その必要はないと思います

スクリプトに追加のコマンドラインフラグや引数を与えられるようにしたい場合は、 video2gif-prompt.bat という名前の新しいファイルを作成して、レジストリで video2gif.bat の代わりにそれを参照するようにしてください

@echo off
set /p inp=Enter extrta args, if desired:
C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat %* %inp%

デフォルト値をすぐに取得するためにEnterキーを押すだけで、まだできます

5  chris  2018-04-15


以下はWindowsユーザー向けのバッチファイルです

gifenc.bat:

set start_time=0
set duration=60
set palette="c:\temp\palette.png"
set filters="fps=15,scale=-1:-1:flags=lanczos"
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -vf "%filters%,palettegen" -y %palette%
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y %2

ソースはこちら。FFmpegで高画質GIF。ただのサンプルを抽出する

1つの入力変数を使用して、出力名にGIF (JIFと発音します)拡張子だけを持たせたい場合は、代わりにこれを使用します

set start_time=0
set duration=60
set palette="c:\temp\palette.png"
set filters="fps=15,scale=-1:-1:flags=lanczos"
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -vf "%filters%,palettegen" -y %palette%
set var1=%1
set var2=%var1:~0,-4%
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y %var2%.gif

4  Sun  2016-06-23


ffmpeg commands:

  1. このコマンドを実行して、ffmpeg が良いパレットを見つけられるようにします

    ffmpeg -y -i foo.mp4 -vf fps=30,scale=320:-1:flags=lanczos,palettegen palette.png
    
  2. このコマンドを実行してmp4ファイルをgifに変換します

    ffmpeg -y -i foo.mp4 -i palette.png -filter_complex "fps=30,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" foo.gif
    

あなたはfpsとスケールを微調整したいかもしれません。どちらかを小さくするとファイルサイズが良くなります

簡単なエイリアス関数を作る

こんな感じでエイリアス関数を作ることもできます。自分の.bashrc.bash_profileに追加してみました

function makegif {
ffmpeg -y -i $1 -vf fps=30,scale=320:-1:flags=lanczos,palettegen palette.png
ffmpeg -y -i $1 -i palette.png -filter_complex "fps=30,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" $1.gif
}

そして、ただのmakegif foo

注意: もちろん ffmpeg が必要です。https://www.ffmpeg.org/download.html または brew install ffmpeg で入手できます

2  Aphex  2020-05-01


タイトルとURLをコピーしました