2013-02-22 20:06:30 +0000 2013-02-22 20:06:30 +0000
335
335

どのように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ファイルは非常に低い品質を持っています。

回答 (12)

505
505
505
2013-02-22 21:31:46 +0000

ffmpeg

183k

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
  • この例では、入力の最初の30秒(-ss 30)をスキップし、3秒の出力(-t 3)を作成します。この例では 1 秒あたり 10 フレームのレートを使用しています。
  • scale フィルタは出力を 320 ピクセル幅にリサイズし、アスペクト比を維持したまま自動的に高さを決定します。この例では lanczos スケーリングアルゴリズム を使用しています。
  • palettegen paletteuse フィルターは、入力から生成されたカスタムパレットを生成して使用します。これらのフィルタには多くのオプションがありますので、利用可能なすべてのオプションと値の一覧はリンク先を参照してください。また、下記の 高度なオプション の項も参照してください。
  • split フィルタはすべてを一つのコマンドで実行できるようにし、 パレットの一時的な PNG ファイルを作成する必要がありません。
  • -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 を参照してください。


ImageMagick sierra2_4a の例

227k

もう一つのコマンドライン方式は、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

88
88
88
2014-03-18 09:47:53 +0000

中間の画像ファイルを避けたい場合は、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 Optimizeconvertoptimize-frame のメソッドを実行するように指示します (ImageMagick アニメーション最適化入門 を参照)。

この全プロセスの間、すべてがメモリ内にあることを覚えておいてください。

38
38
38
2015-03-23 18:39:20 +0000

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

20
20
20
2017-10-05 12:04:32 +0000

ステファンさんの回答は非常に良いですね。しかし、動画によってはBuffer queue overflow, dropping.のような警告が出たり、生成されたgifにフレーム落ちがあったりします。これにより、中間パレットのPNGファイルが生成されるのを防ぐことができます。

18
18
18
2015-07-12 09:35:07 +0000

このスクリプトの自作バージョンは、出力解像度とフレームレートをパラメータ化したもので、

./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がインストールされていて、スクリプトが他のファイルと同じフォルダにあること。

12
12
12
2017-09-30 15:23:29 +0000

パレットメソッドを使った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フィルタのおかげです。

11
11
11
2015-05-28 10:55:51 +0000

スクリプトを作って、テストして、動作します。

使い方:

./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.

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

[結果はここで見てください。

10
10
10
2016-12-09 17:34:16 +0000

Linux/Unix/macOS

(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など)を指定することもできます。


macOS

ビデオファイルからGIFを作成することができる[ GIF Brewery ]&003 アプリを試すことができます。

9
9
9
2017-11-14 23:01:37 +0000

選択された答えは、ソースビデオを拡大縮小し、生成された 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が欲しかったときに便利でした。

6
6
6
2017-04-21 15:36:34 +0000

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が存在する場合、それを上書きするためにあなたからの質問です。

4
4
4
2016-06-23 22:31:26 +0000

以下は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
3
3
3
2018-04-15 23:48:54 +0000

このような場合には、「右クリック」のコンテキストメニュー項目を追加して、動画ファイルを 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キーを押すだけですぐにデフォルト値を取得することができます。