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

Hoe converteer ik een video naar GIF met behulp van ffmpeg, met redelijke kwaliteit?

Ik converteer een video naar GIF bestand met ffmpeg:

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

Het werkt geweldig, maar output gif bestand heeft een zeer lage kwaliteit.

Enig idee hoe ik de kwaliteit van geconverteerde gif kan verbeteren?

Antwoorden (12)

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

ffmpeg voorbeeld

183k ffmpeg kan hoge kwaliteit GIF uitvoeren. Voordat je begint is het altijd aan te raden om een recente versie te gebruiken:

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 dit voorbeeld worden de eerste 30 seconden (-ss 30) van de invoer overgeslagen en wordt een uitvoer van 3 seconden (-t 3) gemaakt.
  • fps filter stelt de framerate in. In het voorbeeld wordt een snelheid van 10 beelden per seconde gebruikt.
  • schaal filter zal de uitvoer verkleinen tot 320 pixels breed en automatisch de hoogte bepalen met behoud van de beeldverhouding. In dit voorbeeld wordt het lanczo schaalalgoritme gebruikt.
  • palettegen en paletuse -filters zullen een aangepast palet genereren en gebruiken dat gegenereerd wordt op basis van uw invoer. Deze filters hebben vele opties, dus raadpleeg de links voor een lijst met alle beschikbare opties en waarden. Zie ook het gedeelte Geavanceerde opties hieronder.
  • split filter maakt het mogelijk om alles in één opdracht te doen en voorkomt dat u een tijdelijk PNG-bestand van het palet moet aanmaken.
  • Regellooping met de uitvoeroptie -loop, maar de waarden zijn verwarrend. Een waarde van 0 is oneindige looping, -1 is geen looping, en 1 zal één keer looping zijn, wat betekent dat het twee keer wordt afgespeeld. Dus een waarde van 10 zorgt ervoor dat de GIF 11 keer wordt afgespeeld.

Geavanceerde opties

De palettegen en paletteuse filters hebben veel extra opties. De belangrijkste zijn:

  • stats_mode (palettegen). U kunt de filters dwingen om het palet op het algemene beeld (full, wat de standaard is), alleen de bewegende delen (diff), of elk individueel kader (single) scherp te stellen. Bijvoorbeeld, om een palet te genereren voor elk individueel frame gebruik palettegen=stats_mode=single & paletteuse=new=1.

  • dither (paletuse). Kies het ditheringsalgoritme. Er zijn drie hoofdtypen: deterministisch (bayer), foutverspreiding (alle andere inclusief de standaard sierra2_4a), en geen. Uw GIF kan er beter uitzien met een bepaald ditheringsalgoritme, of helemaal geen dithering. Als u bayer wilt proberen, moet u de optie bayer_scale ook testen.

Zie Hoogwaardige GIF met FFmpeg voor uitleg, voorbeeldafbeeldingen en meer gedetailleerde informatie voor geavanceerd gebruik.

Zie ook de documentatie palettegen en paletuse voor alle beschikbare opties en waarden.

  • *

ImageMagick convert voorbeeld

227k

Een andere opdrachtregelmethode is het doorsturen van ffmpeg naar convert (of magick) van ImageMagick.

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

  • -vf "fps=10,scale=320:-1:flags=lanczos" een filtergrafiek met behulp van de fps en schaal filters. fps stelt de framerate in op 10, en schaal stelt de grootte in op 320 pixels breed en de hoogte wordt automatisch bepaald en gebruikt een waarde die de beeldverhouding behoudt. In dit voorbeeld wordt het lanczo schaalalgoritme gebruikt.

  • -c:v pam Kiest de pam-afbeeldingsencoder. Het voorbeeld geeft het PAM (Portable AnyMap) beeldformaat weer, dat een eenvoudig, verliesloos RGB-formaat is dat transparantie (alpha) ondersteunt en door convert wordt ondersteund. Het is sneller te coderen dan PNG.

  • -f image2pipe kiest de image2pipe muxer omdat bij uitvoer naar een pipe ffmpeg moet worden verteld welke muxer moet worden gebruikt.

convert opties:

  • -delay Zie Framesnelheid instellen sectie hieronder.

  • -loop 0 maakt een oneindige lus.

  • -layers optimize maakt de algemene GIF-optimalisator mogelijk. Zie ImageMagick Animation Optimization voor meer details. Het is niet gegarandeerd dat het een kleinere uitvoer oplevert, dus het is de moeite waard om het zonder -layers optimize te proberen en de resultaten te vergelijken.

Instellen van de framerate

Stel de framerate in met een combinatie van het fps filter in ffmpeg en -delay in convert. Dit kan gecompliceerd zijn omdat convert slechts een ruwe stroom van beelden krijgt, zodat er geen fps behouden blijft. Ten tweede is de waarde van -delay in convert in ticks (er zijn 100 tikken per seconde), niet in frames per seconde. Bijvoorbeeld, met fps=12.5 = 100/12,5 = 8 = -delay 8.

convert rondt de -delay-waarde af op een heel getal, dus 8,4 resulteert in 8 en 8,5 resulteert in 9. Dit betekent in feite dat alleen enkele framerates worden ondersteund bij het instellen van een uniforme vertraging over alle frames (per frame kan een specifieke vertraging worden ingesteld, maar dat ligt buiten dit antwoord).

-delay lijkt te worden genegeerd als het wordt gebruikt als uitvoeroptie, dus het moet worden gebruikt vóór - zoals in het voorbeeld wordt getoond.

Ten slotte kunnen browsers en beeldkijkers een minimale vertraging implementeren, zodat uw -delay toch genegeerd kan worden.

Video hoffelijkheid van U.S. Fish & Wildlife Service National Conservation Training Center.

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

Als u liever tussenliggende beeldbestanden wilt vermijden, kunnen de commando’s van LordNeckBeard tussen ffmpeg en ImageMagick’s convert worden gekopieerd, zodat er geen tussenliggende bestanden nodig zijn:

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

De -f image2pipe vertelt ffmpeg om de video op te splitsen in beelden en deze geschikt te maken voor piped out, en -vcodec ppm specificeert het uitvoerformaat als ppm (om een of andere reden als het formaat png is, leest ofwel convert niet alle beelden uit de pijp, of ffmpeg voert ze niet allemaal uit). De - voor beide opdrachten geeft aan dat een pijp wordt gebruikt voor respectievelijk uitvoer en invoer.

Om het resultaat te optimaliseren zonder een bestand op te slaan, kunt u de uitvoer van convert naar een tweede convert-opdracht leiden:

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

De gif:- vertelt convert om de uitvoer als gif-geformatteerde gegevens te leiden en -layers Optimize vertelt de tweede convert om optimize-frame en optimize-transparancy-methoden uit te voeren (zie de ImageMagick Inleiding tot Animatie-optimalisatie ]). Merk op dat de uitvoer van de -layers Optimize niet altijd een kleinere bestandsgrootte geeft, dus u kunt proberen om eerst naar een gif te converteren zonder optimalisatie om er zeker van te zijn.

Onthoud dat tijdens dit hele proces alles in het geheugen zit, dus u kunt voldoende geheugen nodig hebben als de afbeeldingen vrij groot zijn.

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

Vanaf ffmpeg 2.6 kunnen we nog beter:

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

Het antwoord van @Stephane is zeer goed. Maar het zal een waarschuwing krijgen zoals Buffer queue overflow, dropping. voor wat video, en de gegenereerde gif heeft wat frame laten vallen.

Hier is een betere versie met fifo filter om Buffer queue overflow te vermijden bij het gebruik van paletteuse filter. Door split filter te gebruiken om te voorkomen dat er een tussenliggend palet PNG bestand ontstaat.

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

Ik heb mijn eigen versie van het script gemaakt, die ook de uitvoerresolutie en de framerate parametreert.

Running ./gifenc.sh input.mov output.gif 720 10 zal 720p brede 10fps GIF uitvoeren van de film die je het hebt gegeven. Het kan zijn dat je chmod +x gifenc.sh moet doen voor het bestand.

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

Je kunt de details lezen op mijn Github

Veronderstellingen: ffmpeg is geïnstalleerd, en het script staat in dezelfde map als de andere bestanden.

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

De ffmpeg met palet methode kan worden uitgevoerd in een enkele opdracht, zonder tussenliggende .png-bestand.

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

Dit kan worden gedaan dankzij de split filter.

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

een script gemaakt, getest en werkt.

gebruik:

./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 is een EXCELLENT ScreenCapturing tool voor Linux :)

DANKT A LOT Michael Kohaupt :) Rock steady.

enkele bestandsgrootte stats:

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

zie de resultaten hier.

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

Linux/Unix/macOS

Na @LordNeckbeard aanpak met ffmpeg commando, vindt u de volgende handige Bash functie die kan worden toegevoegd aan uw ~/.bash_profile bestand:

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

Zodra de functie is geladen (handmatig of vanaf . ~/.bash_profile), moet u een nieuw video2gif commando hebben.

Voorbeeldgebruik:

video2gif input.flv

of:

video2gif input.flv 320 10

schaal naar 320 breedte met 10 frames per seconde.

U kunt ook een ander videoformaat opgeven (zoals mp4).

  • *

macOS

U kunt de GIF Brewery app proberen die GIF’s kan maken van videobestanden.

  • *

Als alternatief zijn er verschillende websites die gratis online conversie doen.

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

Het geselecteerde antwoord gaat ervan uit dat u de bronvideo wilt schalen en de fps in de geproduceerde gif wilt wijzigen. Als je dit niet hoeft te doen, werkt het volgende:

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

Dit kwam van pas toen ik een gif wilde die de bronvideo die ik gebruikte getrouw nabootst.

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

Voor windows gebruikers: maak video2gif.bat bestand aan in windows directory met deze inhoud:

@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

En dan overal waar je het kunt gebruiken zoals in dit voorbeeld:

video2gif myvideo.mp4

Dan heb je myvideo.gif in de huidige directory. Als myvideo.gif er is, vraag van jou om het te overschrijven.

EDIT:

Ik stel voor om dit batch-script te gebruiken https://github.com/NabiKAZ/video2gif

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

Hieronder staat het batchbestand voor Windows gebruikers:

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

Source: Als u slechts één invoervariabele wilt gebruiken en de uitvoernaam alleen de GIF (uitgesproken JIF) extensie heeft, gebruik dan deze optie:

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

Hoe voeg je een windows 7/10 “rechts-klik” contextmenu-item toe om je videobestand om te zetten naar gif

Sommige andere antwoorden vermeldden het video2gif -script, dat ik gebruikte. Maar u kunt elk script gebruiken.

Om de contextmenuoptie te maken, moet u uw register bewerken. Open een powershell commandoprompt, met w/ admin privs. Voer deze commando’s uit:

$key = "Registry::HKEY_CLASSES_ROOT# Hoe voeg je een windows 7/10 "rechts-klik" contextmenu-item toe om je videobestand om te zetten naar gif 

Sommige andere antwoorden vermeldden het [ video2gif ]&003-script, dat ik gebruikte. Maar u kunt elk script gebruiken. 

Om de contextmenuoptie te maken, moet u uw register bewerken. Open een powershell commandoprompt, met w/ admin privs. Voer deze commando's uit: 

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

Als u nu met de rechtermuisknop op een bestand klikt, hebt u de optie “Video2Gif uitvoeren”!

btw Ik heb ffmpeg naar `C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static# Hoe voeg je een windows 7/10 “rechts-klik” contextmenu-item toe om je videobestand om te zetten naar gif

Sommige andere antwoorden vermeldden het [ video2gif ]&003-script, dat ik gebruikte. Maar u kunt elk script gebruiken.

Om de contextmenuoptie te maken, moet u uw register bewerken. Open een powershell commandoprompt, met w/ admin privs. Voer deze commando’s uit:

$key = "Registry::HKEY_CLASSES_ROOT# Hoe voeg je een windows 7/10 "rechts-klik" contextmenu-item toe om je videobestand om te zetten naar gif 

Sommige andere antwoorden vermeldden het [ video2gif ]&003-script, dat ik gebruikte. Maar u kunt elk script gebruiken. 

Om de contextmenuoptie te maken, moet u uw register bewerken. Open een powershell commandoprompt, met w/ admin privs. Voer deze commando's uit: 

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

Als u nu met de rechtermuisknop op een bestand klikt, hebt u de optie “Video2Gif uitvoeren”!

btw Ik heb ffmpeg naar geinstalleerd en zet het video2gif.bat script in de vuilnisbak naast ffmpeg.exe. Ik heb ook C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin toegevoegd aan mijn windows PATH, maar ik denk niet dat je dat hoeft te doen.

Als je de optie wilt om wat extra command line flags / args aan het script te kunnen leveren, maak dan een nieuw bestand met de naam video2gif-prompt.bat, en laat het register het verwijzen in plaats van 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%

Je kunt nog steeds gewoon op enter drukken om snel de standaardinstellingen te krijgen.