私は動画を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
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 ピクセル幅に変更し、アスペクト比を維持したまま高さを自動的に決定します。この例では、スケーリングアルゴリズムを使用しています
- palettegen と paletteuse フィルタは、入力から生成されたカスタムパレットを生成して使用します。これらのフィルターには多くのオプションがありますので、 利用可能なすべてのオプションと値の一覧はリンク先を参照してください。下記の高度なオプションの項も参照してください
- split フィルタを使うと、すべてを一つのコマンドで行うことができ、パレットの一時的な PNG ファイルを作成する必要がなくなります
-loop
出力オプションでループを制御しますが、値が混乱しています。0
の値は無限ループ、-1
はループしない、1
は1回ループする、つまり2回再生される。つまり、値が10だとGIFは11回再生されることになります
Advanced options
palettegen と paletteuse フィルタには多くのオプションがあります。最も重要なものは以下の通りです
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 の説明、画像の例、高度な使い方の詳細については、を参照してください
また、利用可能なすべてのオプションと値については、palettegen と paletteuse のドキュメントを参照してください
ImageMagick convert
の例
もう一つのコマンドラインの方法は、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"
filtergraph に fps と scale のフィルタを使用しています。この例では、スケーリングアルゴリズムの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 -delay
とconvert
の組み合わせでフレームレートを設定します。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 番目の convert
に optimize-frame
と optimize-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
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
パレット付きmethodのffmpeg
は、中間の.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:
このコマンドを実行して、ffmpeg が良いパレットを見つけられるようにします
ffmpeg -y -i foo.mp4 -vf fps=30,scale=320:-1:flags=lanczos,palettegen palette.png
このコマンドを実行して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