どのように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ファイルは非常に低い品質を持っています。
私は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ファイルは非常に低い品質を持っています。
ffmpeg例ffmpegは高品質なGIFを出力することができます。始める前に、常に最新のバージョンを使用することをお勧めします。ダウンロード](https://ffmpeg.org/download.html)または[コンパイル](https://trac.ffmpeg.org/wiki/CompilationGuide).
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
-ss 30)をスキップし、3秒の出力(-t 3)を作成します。この例では 1 秒あたり 10 フレームのレートを使用しています。 -loop 出力オプションでループを制御することができますが、値がわかりにくいです。0 の値は無限ループ、-1 はループしない、1 は一度だけループする、つまり二度再生されるということです。つまり、値を 10 にすると GIF は 11 回再生されます。 palettegen と paletteuse フィルタには、多くのオプションが追加されています。最も重要なのは
stats_mode (palettegen) です。このフィルターはパレットの焦点を画像全体に合わせる (full がデフォルトです) か、 可動部分のみに合わせる (diff) か、 個々のフレームに合わせる (single) かのいずれかに強制することができます。たとえば、 個々のフレームごとにパレットを生成するには palettegen=stats_mode=single & paletteuse=new=1 を使用します。ディザリングアルゴリズムを選択します。主に3つのタイプがあります:決定論的(dither)、誤差拡散(デフォルトのbayerを含む他のすべてのタイプ)、そして何もしない。あなたの GIF は、特定のディザリングアルゴリズムを使った方がよく見えるかもしれませんし、ディザリングを全く使わない方がよく見えるかもしれません。説明、画像の例、高度な使い方の詳細については、FFmpeg で高品質 GIF を参照してください。
sierra2_4a の例もう一つのコマンドライン方式は、ImageMagick から bayer から bayer_scale (または convert) へパイプすることです。
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 オプション:
convert fps と scale フィルタを使用した filtergraph 。本例では lanczos scaling algorithm を使用しています。
magick PAM イメージエンコーダを選択します。この例では、PAM (Portable AnyMap) 画像フォーマットを出力していますが、これは透明度(アルファ)をサポートし、ffmpeg でサポートされているシンプルでロスレスな RGB フォーマットです。
-vf "fps=10,scale=320:-1:flags=lanczos" は image2pipe muxer を選択します。これは、パイプに出力する際にどの muxer を使用するかを伝える必要があるためです。詳しくは ImageMagickアニメーション最適化 を参照してください。出力が小さくなることを保証するものではありませんので、-c:v pamを使わずに試して結果を比較してみる価値はあります。
convertの fps フィルタと-f image2pipeの ffmpeg を組み合わせてフレームレートを設定します。これは、convertが画像の生のストリームを取得するだけなので、fpsが保持されないため、ややこしくなることがあります。第二に、-delay の -loop 0 の値は、毎秒のフレーム数ではなく、ticks(毎秒 100 回)の単位です。例えば、-layers optimize = 100/12.5 = 8 = -layers optimize とすると、
ffmpeg は -delay の値を整数に丸めるので、8.4 は 8、8.5 は 9 となります。これは、全てのフレームで一様な遅延を設定する場合、一部のフレームレートのみがサポートされていることを意味します(フレームごとに特定の遅延を設定することもできますが、それはこの答えの範囲を超えています)。
最後に、ブラウザや画像ビューアは最小遅延を実装している場合がありますので、あなたのconvertはいずれにせよ無視される可能性があります。
ビデオ提供:U.S. Fish & Wildlife Service National Conservation Training Center
中間の画像ファイルを避けたい場合は、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 は、ビデオを画像に分割してパイプアウトするように ffmpeg に指示し、-vcodec ppm は出力フォーマットを ppm に指定します (フォーマットが png の場合、何らかの理由で convert はパイプからすべての画像を読み込まないか、または ffmpeg がすべての画像を出力しないことになります)。
ファイルを保存せずに結果を最適化するには、- からの出力を 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
convert は、gif:- に出力を gif フォーマットのデータとしてパイプするように指示し、convert は 2 番目の -layers Optimize に convert と optimize-frame のメソッドを実行するように指示します (ImageMagick アニメーション最適化入門 を参照)。
この全プロセスの間、すべてがメモリ内にあることを覚えておいてください。
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
このスクリプトの自作バージョンは、出力解像度とフレームレートをパラメータ化したもので、
./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がインストールされていて、スクリプトが他のファイルと同じフォルダにあること。
スクリプトを作って、テストして、動作します。
使い方:
./avi2gif.sh ./vokoscreen-2015-05-28_12-41-56.avi
HAVE PHUN :)
vim avi2gif.sh “`
INPUT=$1
STARTATSECOND=0; # in seconds, if you want to skip the first 30 seconds put 30 here
LENGTHOFGIF_VIDEO=9999999; # in seconds, how long the gif animation should be
echo "Generate a palette:” ffmpeg -y -ss $STARTATSECOND -t $LENGTHOFGIF_VIDEO -i $INPUT -vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png
echo “Output the GIF using the palette:” ffmpeg -ss $STARTATSECOND -t $LENGTHOFGIFVIDEO -i $INPUT -i palette.png -filtercomplex “fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse” $INPUT.gif “`
btw. vokoscreen ](http://www.kohaupt-online.de/hp/) は Linux 用の優れた ScreenCapturing ツールです :)
ありがとうございました。ロックステディ。
いくつかのファイルサイズの統計:
5.3M = vokoscreen-2015-04-2815-43-17.avi -> vokoscreen-2015-05-2812-41-56.avi.gif = 1013K
[結果はここで見てください。
(https://superuser.com/a/556031/87805) @LordNeckbeard approach に続いて 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 コマンドが作成されているはずです。
video2gif input.flv
または:
video2gif input.flv 320 10
毎秒10フレームで320幅にスケールします。
別のビデオフォーマット(mp4など)を指定することもできます。
ビデオファイルからGIFを作成することができる[ GIF Brewery ]&003 アプリを試すことができます。
選択された答えは、ソースビデオを拡大縮小し、生成された 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が欲しかったときに便利でした。
Windowsユーザーの場合:
これらの内容でwindowsディレクトリにvideo2gif.batファイルを作成します:
@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が存在する場合、それを上書きするためにあなたからの質問です。
以下は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:サンプルだけを抽出する ](http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html)
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
他の回答の中には video2gif スクリプトを使用しているものもあります。
コンテキストメニューオプションを作成するには、レジストリを編集する必要があります。admin privs で実行している powershell コマンドプロンプトを開きます。これらのコマンドを実行します:
$key = "Registry::HKEY_CLASSES_ROOT# このような場合には、「右クリック」のコンテキストメニュー項目を追加して、動画ファイルを gif に変換する方法
他の回答の中には [ video2gif ]&003 スクリプトを使用しているものもあります。
コンテキストメニューオプションを作成するには、レジストリを編集する必要があります。admin privs で実行している powershell コマンドプロンプトを開きます。これらのコマンドを実行します:
*\shell\Run Video2Gif"
New-Item -Path $key"\Command" -Value "C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat `"%1`"" -Force
今、あなたがファイルを右クリックすると、"Run Video2Gif “オプションがあります!
私は`C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static# このような場合には、「右クリック」のコンテキストメニュー項目を追加して、動画ファイルを gif に変換する方法
他の回答の中には [ video2gif ]&003 スクリプトを使用しているものもあります。
コンテキストメニューオプションを作成するには、レジストリを編集する必要があります。admin privs で実行している powershell コマンドプロンプトを開きます。これらのコマンドを実行します:
$key = "Registry::HKEY_CLASSES_ROOT# このような場合には、「右クリック」のコンテキストメニュー項目を追加して、動画ファイルを gif に変換する方法
他の回答の中には [ video2gif ]&003 スクリプトを使用しているものもあります。
コンテキストメニューオプションを作成するには、レジストリを編集する必要があります。admin privs で実行している powershell コマンドプロンプトを開きます。これらのコマンドを実行します:
*\shell\Run Video2Gif"
New-Item -Path $key"\Command" -Value "C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat `"%1`"" -Force
今、あなたがファイルを右クリックすると、"Run Video2Gif "オプションがあります!
私はにffmpegをインストールし、video2gif.batの右隣のbinディレクトリにffmpeg.exeスクリプトを置きました。
スクリプトに追加のコマンドラインフラグ/引数を与えられるオプションが必要な場合は、C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\binという名前の新しいファイルを作成して、PATHの代わりにレジストリがそれを参照するようにしてください:
@echo off
set /p inp=Enter extrta args, if desired:
C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat %* %inp%
あなたは、Enterキーを押すだけですぐにデフォルト値を取得することができます。