Konwertuję FLV
film do GIF
pliku przy pomocy ffmpeg.
ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
Działa świetnie, ale wyjściowy plik gif ma bardzo niską jakość.
Wszelkie pomysły, jak mogę poprawić jakość przekonwertowanego gif?
Wyjście polecenia:
ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
ffmpeg version 0.8.5-6:0.8.5-0ubuntu0.12.10.1, Copyright (c) 2000-2012 the Libav developers
built on Jan 24 2013 14:52:53 with gcc 4.7.2
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.flv':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2013-02-14 04:00:07
Duration: 00:00:18.85, start: 0.000000, bitrate: 3098 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 2905 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 192 kb/s
Metadata:
creation_time : 2013-02-14 04:00:07
[buffer @ 0x92a8ea0] w:1280 h:720 pixfmt:yuv420p
[scale @ 0x9215100] w:1280 h:720 fmt:yuv420p -> w:320 h:240 fmt:rgb24 flags:0x4
Output #0, gif, to 'output.gif':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2013-02-14 04:00:07
encoder : Lavf53.21.1
Stream #0.0(und): Video: rawvideo, rgb24, 320x240, q=2-31, 200 kb/s, 90k tbn, 10 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream mapping:
Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame= 101 fps= 32 q=0.0 Lsize= 8686kB time=10.10 bitrate=7045.0kbits/s dup=0 drop=149
video:22725kB audio:0kB global headers:0kB muxing overhead -61.778676%
Dzięki.
Odpowiedzi:
ffmpeg
przykład183 tys
ffmpeg
może generować wysokiej jakości GIF. Zawsze zaleca się używanie najnowszej wersji: pobierz lub skompiluj .-ss 30
) wejścia i utworzy 3 sekundy wyjścia (-t 3
).-loop
opcją wyjścia. Wartość0
to nieskończone zapętlenie.Zobacz wysokiej jakości GIF z FFmpeg, aby uzyskać więcej przykładów i opcji.
convert
Przykład wyobrażenia227k
Inną metodą wiersza polecenia jest przesyłanie strumieniowe z
ffmpeg
doconvert
(lubmagick
) z ImageMagick.Ustawianie liczby klatek na sekundę
Ustaw liczbę klatek na sekundę za pomocą kombinacji
fps
filtrów wejściowychffmpeg
i-delay
wejściowychconvert
. Może się to komplikować, ponieważconvert
po prostu dostaje nieprzetworzony strumień obrazów, więc żadne fps nie jest zachowywane. Po drugie,-delay
wartość wconvert
jest w tikach (jest 100 tików na sekundę), a nie w klatkach na sekundę. Na przykład przyfps=12.5
= 100 / 12,5 = 8 =-delay 8
.convert
zaokrągla-delay
wartość do liczby całkowitej, więc 8,4 daje wynik 8, a 8,5 daje wynik 9. Oznacza to, że podczas ustawiania jednolitego opóźnienia we wszystkich ramkach obsługiwane są tylko niektóre częstotliwości klatek (określone opóźnienie można ustawić dla każdej klatki, ale jest ono większe ta odpowiedź).-delay
wydaje się być ignorowany, jeśli jest używany jako opcja wyjściowa, więc należy go użyć wcześniej,-
jak pokazano w przykładzie.Wreszcie przeglądarki i przeglądarki obrazów mogą wprowadzać minimalne opóźnienie, więc i tak
-delay
możesz zostać zignorowany.Wideo dzięki uprzejmości US Fish & Wildlife Service National Conservation Training Center.
źródło
-vf scale=320:-1,format=rgb8,format=rgb24
convert
polecenia konwersji z ramek PNG ostatecznie skorzystałemconvert -delay 5 -loop 0 -dither None -colors 80 "frames/ffout*.png" -fuzz "40%" -layers OptimizeFrame "output.gif"
, co nieco zmniejsza ogólny rozmiar plikuscale=0:-1
, więc kiedy ustawisz skalę na0
, pobierze skalę z filmu.Jeśli wolisz unikać pośrednich plików obrazów, polecenia dostarczane przez LordNeckBeard można przesyłać między programami
ffmpeg
a ImageMagick,convert
dzięki czemu nie są wymagane żadne pliki pośrednie:-f image2pipe
Mówi ffmpeg podzielić film na obrazy i sprawiają, że nadaje się rurami, i-vcodec ppm
określa format wyjściowy będzie ppm (z jakiegoś powodu, jeśli format PNG, alboconvert
nie czytać wszystkie obrazy z rury lub ffmpeg robi nie wypisuje ich wszystkich).-
Zarówno poleceń określa, że rura będzie używana do wyjścia i wejścia odpowiednio.Aby zoptymalizować wynik bez zapisywania pliku, możesz przesłać dane wyjściowe
convert
do drugiegoconvert
polecenia:gif:-
Mówiconvert
do rury swoje wyjście jako gif sformatowanych danych i-layers Optimize
mówi drugiconvert
do wykonywaniaoptimize-frame
ioptimize-transparancy
metod (patrz ImageMagick Wprowadzenie do optymalizacji animacji ). Zauważ, że dane wyjściowe z-layers Optimize
nie zawsze zapewniają mniejszy rozmiar pliku, więc możesz spróbować przekonwertować na gif bez optymalizacji najpierw.Pamiętaj, że podczas całego tego procesu wszystko jest w pamięci, więc możesz potrzebować wystarczającej ilości pamięci, jeśli obrazy są dość duże.
źródło
avconv
convert -delay 5 -loop 0 -layers Optimize - output.gif
split
filtra w ffmpeg. W ogóle nie trzeba nicffmpeg -ss 30 -t 3 -i "input.flv fps=10,scale=320:-1:flags=lanczos,split[x][z];[z]palettegen[y];[x][y]paletteuse" output.gif
Od wersji ffmpeg 2.6 możemy zrobić jeszcze lepiej:
HT
źródło
Stworzyłem własną wersję skryptu, która parametryzuje również rozdzielczość wyjściową i liczbę klatek na sekundę.
Uruchomienie
./gifenc.sh input.mov output.gif 720 10
spowoduje wygenerowanie pliku GIF o szerokości 720p i rozdzielczości 10 kl./s z filmu, który mu dałeś. Może być konieczne wykonaniechmod +x gifenc.sh
pliku.Możesz przeczytać szczegóły na moim Githubie
Założenia: ffmpeg jest zainstalowany, a skrypt znajduje się w tym samym folderze co inne pliki.
źródło
Odpowiedź od @Stephane jest bardzo dobra. Ale otrzyma ostrzeżenie, jak w
Buffer queue overflow, dropping.
przypadku niektórych filmów, a wygenerowanagif
ramka spadła.Oto lepsza wersja z
fifo
filtrem, której należy unikaćBuffer queue overflow
podczas korzystania zpaletteuse
filtru. Korzystając zsplit
filtra, aby uniknąć tworzenia pliku PNG z paletą pośrednią.źródło
fifo
operację filtrowania międzyo2
io3
? Aby uniknąćBuffer queue overflow
ostrzeżenia.napisałem skrypt, przetestowałem i działa.
stosowanie:
MASZ PHUN :)
vim avi2gif.sh
btw: vokoscreen to DOSKONAŁE narzędzie do przechwytywania ekranu w systemie Linux :)
DZIĘKI DUŻO Michael Kohaupt :) Rock stały.
niektóre statystyki wielkości pliku:
5,3 M = vokoscreen-2015-04-28_15-43-17.avi -> vokoscreen-2015-05-28_12-41-56.avi.gif = 1013K
zobacz wyniki tutaj.
źródło
ffmpeg
Z palety metody mogą być prowadzone w jednym poleceniu, bez pośrednika.png
pliku.Można to zrobić dzięki
split
filtrowi.źródło
Linux / Unix / macOS
Zgodnie z podejściem @LordNeckbeard z
ffmpeg
poleceniem znajdź następującą przydatną funkcję Bash, którą można dodać do~/.bash_profile
pliku:Po załadowaniu funkcji (ręcznie lub z
. ~/.bash_profile
) powinieneś mieć nowevideo2gif
polecenie.Przykładowe użycie:
lub:
Skaluj do szerokości 320 z 10 klatkami na sekundę.
Możesz także określić inny format wideo (np. MP4).
System operacyjny Mac
Możesz wypróbować aplikację GIF Brewery, która może tworzyć pliki GIF z plików wideo.
Alternatywnie istnieje kilka stron internetowych, które dokonują konwersji online bezpłatnie.
źródło
Wybrana odpowiedź zakłada, że chcesz przeskalować wideo źródłowe i zmienić jego fps w utworzonym gifie. Jeśli nie musisz tego robić, działają następujące czynności:
Przydało się to, gdy chciałem gif, który wiernie odtworzył wideo źródłowe, którego używałem.
źródło
Dla użytkowników systemu Windows:
utwórz
video2gif.bat
plik w katalogu systemu Windows z następującą zawartością:A potem gdziekolwiek możesz go użyć, tak jak w tym przykładzie:
Następnie masz
myvideo.gif
w bieżącym katalogu.Jeśli
myvideo.gif
istnieje, poproś go o zastąpienie.EDYTOWAĆ:
Sugeruję użycie tego skryptu wsadowego: https://github.com/NabiKAZ/video2gif
źródło
fps=10
iscale=-1:-1
). Odpowiedź Sun już dała nam plik wsadowy, a ten (podobnie jak skrypty powłoki w odpowiedzi pje i odpowiedź anioła ) ma tę zaletę, że przypisuje listę filtrów do zmiennej ( raz ),… ( ciąg dalszy )fps=10,scale=-1:-1
)? (Zobacz odpowiedź zauważalnego na przykład wyjaśnienia części polecenia).Poniżej znajduje się plik wsadowy dla użytkowników systemu Windows:
gifenc.bat:
Źródło: Wysokiej jakości GIF z FFmpeg: Wyodrębnianie tylko próbki
Jeśli chcesz użyć tylko jednej zmiennej wejściowej, a nazwa wyjściowa ma tylko rozszerzenie GIF (wymawiane JIF), użyj tego zamiast tego:
źródło
Jak dodać pozycję menu kontekstowego Windows 7/10 „prawym przyciskiem myszy”, aby przekonwertować plik wideo na gif
Niektóre inne odpowiedzi dotyczyły skryptu video2gif , którego użyłem. Ale możesz użyć dowolnego skryptu.
Aby utworzyć opcję menu kontekstowego, musisz edytować rejestr. Otwórz wiersz polecenia PowerShell, uruchamiając w / admin privs. Wykonaj następujące polecenia:
Teraz, kiedy klikniesz plik prawym przyciskiem myszy, pojawi się opcja „Uruchom Video2Gif”!
btw Zainstalowałem ffmpeg
C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\
i umieściłemvideo2gif.bat
skrypt w katalogu bin tuż obokffmpeg.exe
. Dodałem równieżC:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin
do moich okienPATH
, ale nie sądzę, że musisz.Jeśli chcesz mieć możliwość dostarczenia dodatkowych skryptów / argumentów wiersza poleceń do skryptu, utwórz nowy plik o nazwie
video2gif-prompt.bat
i poproś go o odwołanie do rejestru zamiastvideo2gif.bat
:Nadal możesz po prostu nacisnąć Enter, aby szybko uzyskać ustawienia domyślne.
źródło