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

Wie konvertiere ich ein Video mit ffmpeg in GIF mit vernünftiger Qualität?

Ich konvertiere ein Video in eine GIF-Datei mit ffmpeg:

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

Es funktioniert großartig, aber die GIF-Ausgabedatei hat eine sehr niedrige Qualität.

Irgendwelche Ideen, wie ich die Qualität der konvertierten GIF-Datei verbessern kann?

Antworten (12)

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

ffmpeg Beispiel

183k

ffmpeg kann GIF in hoher Qualität ausgeben. Bevor Sie anfangen, ist es immer empfehlenswert, eine aktuelle Version zu verwenden: download oder compile .

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
  • In diesem Beispiel werden die ersten 30 Sekunden (-ss 30) der Eingabe übersprungen und eine 3-Sekunden-Ausgabe (-t 3) erzeugt.
  • fps Filter legt die Bildfrequenz fest. Im Beispiel wird eine Rate von 10 Bildern pro Sekunde verwendet. Der Filter
  • scale passt die Größe der Ausgabe auf 320 Pixel Breite an und bestimmt automatisch die Höhe unter Beibehaltung des Seitenverhältnisses. Die Filter
  • palettegen und paletteuse erzeugen und verwenden eine benutzerdefinierte Palette, die aus Ihrer Eingabe generiert wird. Diese Filter verfügen über viele Optionen, daher finden Sie unter den Links eine Liste aller verfügbaren Optionen und Werte. Siehe auch den Abschnitt Erweiterte Optionen weiter unten.
  • split Filter ermöglicht es, alles mit einem Befehl zu erledigen und vermeidet, dass eine temporäre PNG-Datei der Palette erstellt werden muss.
  • Regelschleife mit der Ausgabeoption -loop, aber die Werte sind verwirrend. Ein Wert von 0 ist eine Endlosschleife, -1 ist keine Endlosschleife, und 1 wird einmal eine Schleife durchlaufen, was bedeutet, dass es zweimal abgespielt wird. Ein Wert von 10 bewirkt also, dass das GIF 11 Mal abgespielt wird.

Erweiterte Optionen

Die Filter palettegen und paletteuse haben viele zusätzliche Optionen. Die wichtigsten sind:

  • stats_mode (Palettengen). Sie können die Filter zwingen, die Palette auf das Gesamtbild (full, was die Voreinstellung ist), nur die beweglichen Teile (diff) oder jeden einzelnen Rahmen (single) zu fokussieren. Um beispielsweise eine Palette für jeden einzelnen Rahmen zu erzeugen, verwenden Sie palettegen=stats_mode=single & paletteuse=new=1.

  • dither (Palettenbenutzung). Wählen Sie den Dithering-Algorithmus. Es gibt drei Haupttypen: deterministisch (bayer), Fehlerdiffusion (alle anderen einschließlich des Standard-Algorithmus sierra2_4a) und keine. Ihr GIF kann besser aussehen, wenn Sie einen bestimmten Dithering-Algorithmus oder gar kein Dithering verwenden. Wenn Sie bayer ausprobieren möchten, sollten Sie unbedingt auch die Option bayer_scale testen.

Siehe Hochwertiges GIF mit FFmpeg für Erklärungen, Beispielbilder und ausführlichere Informationen für fortgeschrittene Nutzung.

Siehe auch die Dokumentation palettegen und paletteuse für alle verfügbaren Optionen und Werte.


ImageMagick convert Beispiel

227k

Eine weitere Befehlszeilenmethode ist die Pipeline von ffmpeg nach convert (oder magick) von ImageMagick aus.

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 Optionen:

  • -vf "fps=10,scale=320:-1:flags=lanczos" a filtergraph unter Verwendung der Filter fps und scale . fps setzt die Bildrate auf 10, und scale setzt die Größe auf 320 Pixel Breite und Höhe, wobei die Höhe automatisch bestimmt wird und einen Wert verwendet, der das Seitenverhältnis beibehält. In diesem Beispiel wird der Lanczos Skalierungsalgorithmus verwendet.

  • -c:v pam wählt den Pam-Bild-Encoder. Das Beispiel gibt das Bildformat PAM (Portable AnyMap) aus, bei dem es sich um ein einfaches, verlustfreies RGB-Format handelt, das Transparenz (Alpha) unterstützt und von convert unterstützt wird. Es ist schneller zu kodieren als PNG.

  • -f image2pipe wählt den image2pipe-Muxer, da bei der Ausgabe in eine Pipe ffmpeg mitgeteilt werden muss, welchen Muxer er verwenden soll.

convert Optionen:

  • -delay Siehe Abschnitt Bildrate einstellen weiter unten.

  • -loop 0 macht Endlosschleife.

  • -layers optimize Aktiviert den Allzweck-GIF-Optimierer. Siehe ImageMagick-Animationsoptimierung für weitere Einzelheiten. Es ist nicht garantiert, dass er eine kleinere Ausgabe erzeugt, daher lohnt es sich, auf -layers optimize zu verzichten und die Ergebnisse zu vergleichen.

Bildfrequenz einstellen

Bildfrequenz mit einer Kombination aus dem Filter fps in ffmpeg und -delay in convert einstellen. Dies kann kompliziert werden, da convert nur einen Rohdatenstrom von Bildern erhält, so dass keine fps erhalten bleiben. Zweitens ist der Wert von -delay in convert in Ticks (es gibt 100 Ticks pro Sekunde) und nicht in Bildern pro Sekunde. Zum Beispiel mit fps=12.5 = 100/12,5 = 8 = -delay 8.

convert rundet den -delay-Wert auf eine ganze Zahl, so dass 8,4 zu 8 und 8,5 zu 9 führt. Dies bedeutet effektiv, dass nur einige Bildwiederholraten unterstützt werden, wenn eine einheitliche Verzögerung über alle Bilder eingestellt wird (eine bestimmte Verzögerung kann pro Bild eingestellt werden, aber das geht über diese Antwort hinaus).

-delay scheint ignoriert zu werden, wenn sie als Ausgabeoption verwendet wird, so dass sie, wie im Beispiel gezeigt, vor - verwendet werden muss.

Schließlich können Browser und Bildbetrachter eine minimale Verzögerung implementieren, so dass Ihre -delay möglicherweise trotzdem ignoriert wird.

Video mit freundlicher Genehmigung des U.S. Fish & Wildlife Service National Conservation Training Center.

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

Wenn Sie Zwischenbilddateien vermeiden möchten, können die von LordNeckBeard bereitgestellten Befehle zwischen ffmpeg und ImageMagick’s convert über die Pipeline übertragen werden, so dass keine Zwischendateien erforderlich sind:

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

Die -f image2pipe weist ffmpeg an, das Video in Bilder zu zerlegen und für die Pipeline geeignet zu machen, und -vcodec ppm gibt als Ausgabeformat ppm an (aus irgendeinem Grund liest entweder convert nicht alle Bilder aus der Pipe, oder ffmpeg gibt sie nicht alle aus). Die - für beide Befehle gibt an, dass eine Pipe für die Ausgabe bzw. Eingabe verwendet wird.

Um das Ergebnis zu optimieren, ohne eine Datei zu speichern, können Sie die Ausgabe von convert über die Pipe an einen zweiten convert-Befehl übergeben:

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

Die gif:- weist convert an, die Ausgabe als GIF-formatierte Daten über die Pipe zu übergeben, und -layers Optimize weist die zweite convert an, die Methoden optimize-frame und optimize-transparancy auszuführen (siehe ImageMagick Einführung in die Optimierung von Animationen ). Beachten Sie, dass die Ausgabe von -layers Optimize nicht immer eine kleinere Dateigröße liefert, so dass Sie vielleicht versuchen sollten, die Konvertierung in ein Gif ohne Optimierung durchzuführen, um sicherzugehen.

Denken Sie daran, dass sich während dieses ganzen Prozesses alles im Speicher befindet, so dass Sie möglicherweise ausreichend Speicher benötigen, wenn die Bilder recht groß sind.

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

Ab ffmpeg 2.6 können wir es noch besser machen:

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

Die Antwort von @Stephane ist sehr gut. Aber es wird eine Warnung wie Buffer queue overflow, dropping. für einige Videos erhalten, und die generierte gif hat einige Frames fallen gelassen.

Hier ist eine bessere Version mit fifo-Filter, um Buffer queue overflow zu vermeiden, wenn paletteuse-Filter verwendet wird. Bei Verwendung von split-Filter zur Vermeidung der Erstellung einer Zwischenpaletten-PNG-Datei.

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
18
18
18
2015-07-12 09:35:07 +0000

Ich habe eine eigene Version des Skripts erstellt, die auch die Ausgabeauflösung und die Bildfrequenz parametrisiert.

Mit ./gifenc.sh input.mov output.gif 720 10 wird ein 720p breites 10fps-GIF aus dem Film, den Sie ihm gegeben haben, ausgegeben. Möglicherweise müssen Sie chmod +x gifenc.sh für die Datei ausführen.

#!/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"

Sie können die Details auf meinen Github

Annahmen lesen: ffmpeg ist installiert, und das Skript befindet sich im gleichen Ordner wie die anderen Dateien.

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

Die ffmpeg mit Palette Methode kann in einem einzigen Befehl ohne zwischengeschaltete .png-Datei ausgeführt werden.

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

Dies ist dank des Filters split möglich.

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

hat ein Skript erstellt, getestet und funktioniert.

Verwendung:

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

btw: vokoscreen ist ein AUSGEZEICHNETES ScreenCapturing-Tool für Linux :)

VIELEN DANK Michael Kohaupt :) Rock steady.

einige Statistiken zur Dateigröße:

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

siehe die Ergebnisse hier.

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

Linux/Unix/macOS

Nach @LordNeckbeard approach mit dem Befehl ffmpeg finden Sie die folgende nützliche Bash-Funktion, die Sie in Ihre ~/.bash_profile-Datei einfügen können:

# 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"
}

Sobald die Funktion geladen ist (manuell oder von . ~/.bash_profile), sollten Sie den neuen Befehl video2gif haben.

Beispielverwendung:

video2gif input.flv

oder:

video2gif input.flv 320 10

Skalierung auf 320 Breite mit 10 Bildern pro Sekunde.

Sie können auch ein anderes Videoformat angeben (z. B. mp4).


macOS

Sie können die Anwendung GIF Brewery ausprobieren, die GIFs aus Videodateien erstellen kann.


Alternativ gibt es mehrere Websites, die die Konvertierung online kostenlos durchführen.

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

In der gewählten Antwort wird davon ausgegangen, dass Sie das Quellvideo skalieren und seine fps in der erzeugten Gif-Datei ändern möchten. Wenn Sie dies nicht tun müssen, funktioniert folgendes:

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

Dies hat sich als nützlich erwiesen, wenn ich ein Gif wollte, das das von mir verwendete Quellvideo originalgetreu wiedergibt.

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

Für Windows-Benutzer: Datei video2gif.bat im Windows-Verzeichnis mit folgendem Inhalt erstellen:

@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

Und dann überall dort, wo Sie es verwenden können, wie in diesem Beispiel:

video2gif myvideo.mp4

Dann haben Sie myvideo.gif im aktuellen Verzeichnis. Wenn myvideo.gif vorhanden ist, Frage von Ihnen nach Überschreiben.

EDIT:

Ich schlage vor, dieses Batch-Skript zu verwenden https://github.com/NabiKAZ/video2gif

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

Unten finden Sie die Batch-Datei für Windows-Benutzer:

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

Quelle: Hochwertiges GIF mit FFmpeg: Extrahieren nur eines Beispiels

Wenn Sie nur eine Eingabevariable verwenden möchten und der Ausgabename nur die GIF-Erweiterung (ausgesprochen JIF) haben soll, dann verwenden Sie stattdessen diese:

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

Wie man einen Windows 7/10 “Rechtsklick”-Kontextmenüeintrag hinzufügt, um Ihre Videodatei in gif

zu konvertieren Einige der anderen Antworten erwähnten das Skript video2gif , das ich verwendet habe. Aber Sie können jedes beliebige Skript verwenden.

Um die Kontextmenü-Option zu erstellen, müssen Sie Ihre Registrierung bearbeiten. Öffnen Sie eine Power-Shell-Eingabeaufforderung, und führen Sie w/ admin privs aus. Führen Sie diese Befehle aus:

$key = "Registry::HKEY_CLASSES_ROOT# Wie man einen Windows 7/10 "Rechtsklick"-Kontextmenüeintrag hinzufügt, um Ihre Videodatei in gif 

zu konvertieren Einige der anderen Antworten erwähnten das Skript [ video2gif ]&003, das ich verwendet habe. Aber Sie können jedes beliebige Skript verwenden. 

Um die Kontextmenü-Option zu erstellen, müssen Sie Ihre Registrierung bearbeiten. Öffnen Sie eine Power-Shell-Eingabeaufforderung, und führen Sie w/ admin privs aus. Führen Sie diese Befehle aus: 


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

Wenn Sie jetzt mit der rechten Maustaste auf eine Datei klicken, haben Sie die Option “Run Video2Gif”!

Ich habe übrigens ffmpeg nach `C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static# Wie man einen Windows 7/10 “Rechtsklick”-Kontextmenüeintrag hinzufügt, um Ihre Videodatei in gif

zu konvertieren Einige der anderen Antworten erwähnten das Skript [ video2gif ]&003, das ich verwendet habe. Aber Sie können jedes beliebige Skript verwenden.

Um die Kontextmenü-Option zu erstellen, müssen Sie Ihre Registrierung bearbeiten. Öffnen Sie eine Power-Shell-Eingabeaufforderung, und führen Sie w/ admin privs aus. Führen Sie diese Befehle aus:

$key = "Registry::HKEY_CLASSES_ROOT# Wie man einen Windows 7/10 "Rechtsklick"-Kontextmenüeintrag hinzufügt, um Ihre Videodatei in gif 

zu konvertieren Einige der anderen Antworten erwähnten das Skript [ video2gif ]&003, das ich verwendet habe. Aber Sie können jedes beliebige Skript verwenden. 

Um die Kontextmenü-Option zu erstellen, müssen Sie Ihre Registrierung bearbeiten. Öffnen Sie eine Power-Shell-Eingabeaufforderung, und führen Sie w/ admin privs aus. Führen Sie diese Befehle aus: 


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

Wenn Sie jetzt mit der rechten Maustaste auf eine Datei klicken, haben Sie die Option “Run Video2Gif”!

Ich habe übrigens ffmpeg nach installiert und das Skript video2gif.bat in das bin dir direkt neben ffmpeg.exe gelegt. Ich habe auch C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin zu meinem Windows-Skript PATH hinzugefügt, aber ich glaube nicht, daß Sie das brauchen.

Wenn Sie die Möglichkeit haben wollen, dem Skript einige zusätzliche Befehlszeilen-Flags / args zu übergeben, dann erstellen Sie eine neue Datei mit dem Namen video2gif-prompt.bat, und lassen Sie sie von der Registry anstelle von video2gif.bat referenzieren:

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

Sie können immer noch einfach die Eingabetaste drücken, um schnell die Standardeinstellungen zu erhalten.