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

Jak przekonwertować wideo do GIF za pomocą ffmpeg, z rozsądną jakością?

Jestem konwertowania wideo do pliku GIF z ffmpeg:

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

To działa świetnie, ale wyjściowy plik gif ma bardzo niską jakość.

Wszelkie pomysły, jak mogę poprawić jakość konwertowanego gif?

Odpowiedzi (12)

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

ffmpeg przykład

183k

ffmpeg może dać wysokiej jakości GIF. Zanim zaczniesz, zawsze zaleca się korzystanie z najnowszej wersji: download lub 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
  • Ten przykład pominie pierwsze 30 sekund (-ss 30) wejścia i utworzy 3 sekundowe wyjście (-t 3).
  • fps filtr ustawia częstotliwość odświeżania obrazu. W przykładzie użyto prędkości 10 klatek na sekundę. Filtr
  • scale zmieni rozmiar wyjścia na 320 pikseli szerokości i automatycznie określi wysokość przy zachowaniu proporcji. W tym przykładzie użyto lanczos algorytm skalowania . Filtry
  • paletegen i użycie palety wygenerują i użyją niestandardowej palety wygenerowanej z Twojego wejścia. Filtry te mają wiele opcji, więc zapoznaj się z linkami, aby uzyskać listę wszystkich dostępnych opcji i wartości. Zobacz również sekcję Opcje zaawansowane poniżej.
  • Filtr split pozwoli na zrobienie wszystkiego w jednym poleceniu i uniknie konieczności tworzenia tymczasowego pliku PNG palety.
  • Pętla kontrolna z opcją wyjścia -loop, ale wartości są mylące. Wartość 0 jest nieskończonym zapętleniem, -1 nie jest zapętleniem, a 1 zapętli się raz, co oznacza, że będzie odtwarzać dwa razy. Tak więc wartość 10 spowoduje, że GIF zagra 11 razy.

Advanced options

Filtry paletegen i paletteuse mają wiele dodatkowych opcji. Najważniejsze z nich to:

  • stats_mode (paletegen). Możesz wymusić na filtrach skupienie palety na obrazie ogólnym (full, który jest domyślny), tylko części ruchomej (diff), lub każdej pojedynczej klatce (single). Na przykład, aby wygenerować paletę dla każdej pojedynczej klatki użyj palettegen=stats_mode=single & paletteuse=new=1.

  • dither (użycie palety). Wybierz algorytm ditheringowy. Istnieją trzy główne typy: deterministyczny (bayer), dyfuzyjny (wszystkie pozostałe łącznie z domyślnym sierra2_4a), i żaden. Twój GIF może wyglądać lepiej przy użyciu konkretnego algorytmu ditheringu, lub nie ma ditheringu w ogóle. Jeśli chcesz spróbować bayer, sprawdź również opcję bayer_scale.

Zobacz Wysokiej jakości GIF z FFmpeg aby uzyskać wyjaśnienia, przykładowe obrazy, oraz bardziej szczegółowe informacje dotyczące zaawansowanego użycia.

Zobacz również dokumentację paletegen i paletteuse dla wszystkich dostępnych opcji i wartości.

  • *

ImageMagick convert example

227k

Inną metodą linii poleceń jest wyprowadzenie z ffmpeg do convert (lub magick) z 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 opcje:

  • -vf "fps=10,scale=320:-1:flags=lanczos" a filtergraph przy użyciu filtrów fps i scale . fps ustawia częstotliwość odświeżania na 10, a skala ustawia rozmiar na 320 pikseli szerokości i wysokości jest określana automatycznie i wykorzystuje wartość zachowującą proporcje. W tym przykładzie zastosowano lanczos algorytm skalowania .

  • -c:v pam Wybór kodera obrazu pam. W przykładzie wyświetlany jest format obrazu PAM (Portable AnyMap), który jest prostym, bezstratnym formatem RGB obsługującym przezroczystość (alfa) i jest obsługiwany przez convert. Jest on szybszy do kodowania niż PNG.

  • -f image2pipe wybiera multiplekser image2pipe, ponieważ podczas wysyłania do potoku ffmpeg musi zostać poinformowany, którego muxera użyć.

convert Opcje:

  • -delay Patrz Ustawianie częstotliwości odświeżania poniżej.

  • -loop 0 tworzy nieskończoną pętlę.

  • -layers optimize Włączy optymalizator ogólnego przeznaczenia GIF. Zobacz ImageMagick Animation Optimization aby uzyskać więcej szczegółów. Nie ma gwarancji, że uzyska mniejszą moc wyjściową, warto więc spróbować bez -layers optimize i porównać wyniki.

Ustawianie częstotliwości odświeżania obrazu

Ustawianie częstotliwości odświeżania obrazu z kombinacją filtrów fps w ffmpeg i -delay w convert. Może się to skomplikować, ponieważ w convert otrzymujemy tylko surowy strumień obrazów, więc nie zachowujemy żadnych fps. Po drugie, wartość -delay w convert jest w ticks (jest 100 ticków na sekundę), a nie w klatkach na sekundę. Na przykład z fps=12.5 = 100/12.5 = 8 = -delay 8.

convert zaokrągla wartość -delay do liczby całkowitej, więc 8.4 daje wynik 8 a 8.5 9. Skutecznie oznacza to, że tylko niektóre ramki są obsługiwane przy ustawianiu jednolitego opóźnienia na wszystkich klatkach (można ustawić konkretne opóźnienie na każdą klatkę, ale to jest poza tą odpowiedzią).

-delay wydaje się być ignorowane, jeśli jest używana jako opcja wyjściowa, więc musi być używana przed - jak pokazano w przykładzie.

Wreszcie, przeglądarki i przeglądarki obrazów mogą wprowadzić minimalne opóźnienie, więc Twój -delay może być ignorowany.

Wideo dzięki uprzejmości US Fish & Wildlife Service National Conservation Training Center.

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

Jeśli wolisz unikać pośrednich plików graficznych, polecenia dostarczane przez LordNeckBeard mogą być przesyłane potokiem pomiędzy ffmpeg i ImageMagick’s convert, dzięki czemu nie są wymagane żadne pliki pośrednie:

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

-f image2pipe każe ffmpegowi podzielić film na obrazy i sprawić, by nadawał się do wypompowania, a -vcodec ppm określa format wyjściowy jako ppm (z jakiegoś powodu, jeśli formatem jest png, albo convert nie odczytuje wszystkich obrazów z potoku, albo ffmpeg nie wypisuje ich wszystkich). - dla obu poleceń określa, że potok będzie użyty odpowiednio dla wyjścia i wejścia.

Aby zoptymalizować wynik bez zapisywania pliku, możesz potokować wyjście z convert do drugiego polecenia 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:- mówi convert, aby potokował wyjście jako dane w formacie gif, a -layers Optimize mówi drugiemu convert, aby wykonało metody optimize-frame i optimize-transparancy (zobacz ImageMagick Introduction to Animation Optimization ). Zauważ, że wyjście z -layers Optimize nie zawsze zapewnia mniejszy rozmiar pliku, więc możesz spróbować konwersji do formatu gif bez optymalizacji, aby mieć pewność.

Pamiętaj, że podczas tego całego procesu wszystko jest w pamięci, więc możesz potrzebować wystarczającej ilości pamięci, jeśli obrazy są dość duże.

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

Od ffmpeg 2.6 możemy zrobić jeszcze lepiej:

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

Odpowiedź z @Stephane jest bardzo dobra. But it will get a warning like Buffer queue overflow, dropping. for some video, and the generated gif has some frame dropped.

Here is a better version with fifo filter to avoid Buffer queue overflow when using paletteuse filter. Używając filtra split, aby uniknąć tworzenia pliku PNG w palecie pośredniej.

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

Stworzyłem własną wersję skryptu, która parametryzuje również rozdzielczość wyjściową i liczbę klatek na sekundę.

Running ./gifenc.sh input.mov output.gif 720 10 wyświetli 720p szeroki 10fps GIF z filmu, który dałeś. Być może będziesz musiał zrobić chmod +x gifenc.sh dla tego pliku.

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

Możesz przeczytać szczegóły na moim Github

Założenia: ffmpeg jest zainstalowany, a skrypt jest w tym samym folderze co inne pliki.

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

ffmpeg z paletą metoda może być uruchomiony w jednym poleceniu, bez pliku pośredniego .png.

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

Można to zrobić dzięki filtrowi split .

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

zrobił skrypt, przetestował i działa.

użycie:

./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 to EXCELLENTNE narzędzie do przechwytywania ekranu dla Linuksa :)

THANKS A LOT Michael Kohaupt :) Rock steady.

some file size stats:

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

see the results here.

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

Linux/Unix/macOS

Po @LordNeckbeard approach z komendą ffmpeg, proszę znaleźć następującą użyteczną funkcję Bash, która może być dodana do pliku ~/.bash_profile:

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

Po załadowaniu funkcji (ręcznie lub z . ~/.bash_profile), powinieneś mieć nową komendę video2gif.

Przykładowe użycie:

video2gif input.flv

lub:

video2gif input.flv 320 10

Skalowanie do 320 szerokości z 10 klatkami na sekundę.

Możesz również określić inny format wideo (np. mp4).

  • *

MacOS

Możesz spróbować Browar GIF aplikacji, która może tworzyć GIF-y z plików wideo.

  • *

Alternatywnie istnieje kilka stron internetowych, które robią konwersji online za darmo.

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

Wybrana odpowiedź zakłada, że chcesz przeskalować film źródłowy i zmienić jego fps w wyprodukowanym prezencie. Jeśli nie musisz tego robić, następujące prace:

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

Przydało się to, gdy chciałam mieć prezent, który wiernie odtworzyłby źródłowe wideo, którego użyłam.

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

Dla użytkowników Windows: stwórz plik video2gif.bat w katalogu Windows z następującą zawartością:

@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

I wtedy gdziekolwiek możesz go użyć, będzie jak w tym przykładzie:

video2gif myvideo.mp4

Wtedy masz myvideo.gif w aktualnym katalogu. Jeśli myvideo.gif istnieje, pytanie od Ciebie o nadpisanie go.

EDIT:

Sugeruję użyć tego skryptu wsadowego https://github.com/NabiKAZ/video2gif

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

Poniżej znajduje się plik wsadowy dla użytkowników 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

Źródło: High quality GIF with FFmpeg: Extracting just a sample

Jeśli chcesz użyć tylko jednej zmiennej wejściowej, a nazwa wyjściowa ma tylko rozszerzenie GIF (wymawiane JIF), to użyj tego zamiast:

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

Jak dodać okno 7/10 “kliknij prawym przyciskiem myszy” wejście menu kontekstowego, aby przekonwertować plik wideo do gif

Niektóre z innych odpowiedzi wymienione video2gif skrypt, który użyłem. Ale, możesz użyć dowolnego skryptu.

Aby utworzyć opcję menu kontekstowego, musisz edytować swój rejestr. Otwórz polecenie powershell, uruchamiając w/ admin privs. Wykonaj te komendy:

$key = "Registry::HKEY_CLASSES_ROOT# Jak dodać okno 7/10 "kliknij prawym przyciskiem myszy" wejście menu kontekstowego, aby przekonwertować plik wideo do gif 

Niektóre z innych odpowiedzi wymienione [ video2gif ]&003 skrypt, który użyłem. Ale, możesz użyć dowolnego skryptu. 

Aby utworzyć opcję menu kontekstowego, musisz edytować swój rejestr. Otwórz polecenie powershell, uruchamiając w/ admin privs. Wykonaj te komendy: 

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

Teraz, gdy klikniesz prawym przyciskiem myszy na plik, będziesz miał opcję “Run Video2Gif”!

btw Zainstalowałem ffmpeg do `C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static# Jak dodać okno 7/10 “kliknij prawym przyciskiem myszy” wejście menu kontekstowego, aby przekonwertować plik wideo do gif

Niektóre z innych odpowiedzi wymienione [ video2gif ]&003 skrypt, który użyłem. Ale, możesz użyć dowolnego skryptu.

Aby utworzyć opcję menu kontekstowego, musisz edytować swój rejestr. Otwórz polecenie powershell, uruchamiając w/ admin privs. Wykonaj te komendy:

$key = "Registry::HKEY_CLASSES_ROOT# Jak dodać okno 7/10 "kliknij prawym przyciskiem myszy" wejście menu kontekstowego, aby przekonwertować plik wideo do gif 

Niektóre z innych odpowiedzi wymienione [ video2gif ]&003 skrypt, który użyłem. Ale, możesz użyć dowolnego skryptu. 

Aby utworzyć opcję menu kontekstowego, musisz edytować swój rejestr. Otwórz polecenie powershell, uruchamiając w/ admin privs. Wykonaj te komendy: 

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

Teraz, gdy klikniesz prawym przyciskiem myszy na plik, będziesz miał opcję “Run Video2Gif”!

btw Zainstalowałem ffmpeg do i umieściłem skrypt video2gif.bat w koszu obok ffmpeg.exe. Dodałem także C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin do mojego okna PATH, ale nie sądzę, abyś tego potrzebował.

Jeśli chcesz mieć możliwość dodania do skryptu dodatkowych flag / argumentów z linii poleceń, to stwórz nowy plik o nazwie video2gif-prompt.bat, i niech rejestr przekieruje go zamiast 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%

Nadal możesz po prostu wcisnąć enter, aby szybko uzyskać domyślne ustawienia.