Jak utworzyć animowany GIF z wideo MP4 za pomocą wiersza poleceń?

119

Chcę zrobić animację .gifz .mp4wideo. Wolałbym to zrobić z wiersza poleceń, więc proszę wypisać tylko narzędzia wiersza poleceń.

Maythux
źródło
Możesz użyć tego skryptu w Github, który używa FFMPEG i generuje pośrednią paletę kolorów dla lepszej jakości obrazu.
troyane

Odpowiedzi:

127

ffmpeg 3.4.4 może to zrobić bezpośrednio na Ubuntu 18.04

Prawdopodobnie chcesz użyć czegoś takiego:

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

Testuj procedurę generowania danych opisaną w tym poście .

Bardziej bezpośredni:

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

również działa, ale wyjściowy GIF byłby znacznie większy niż wejściowy wideo, ponieważ formaty wideo inteligentnie kompresują się między ramkami.

Podział argumentów:

  • ulimit -Sv 1000000: ustaw maksymalny rozmiar pamięci 1 Gb dla programu.

    Głównie ja upewniam się, że polecenie nie używa nieograniczonej pamięci, tak jak niektóre wcześniejsze próby.

    500 Mb powoduje, że ffmpeg nie ładuje bibliotek współdzielonych ... czas na aktualizację pamięci RAM?

  • -ss 00:00:03 -to 00:00:06: czas rozpoczęcia i zakończenia wycięcia filmu.

    Nie, pliki GIF nie są najlepszym sposobem na pirackie rozpowszechnianie filmów online.

    Zobacz także: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg

  • -vf scale=512:-1: 512ustaw wyjściowe piksele na wysokość i dostosuj szerokość, aby zachować proporcje.

    Jest to częsty przypadek użycia obrazów w Internecie, które mają znacznie mniejszą rozdzielczość niż wideo.

    Jeśli usuniesz tę opcję, wyjściowy plik GIF ma taką samą wysokość jak wejściowe wideo.

    Oryginalną wysokość wideo można znaleźć na przykład ffprobe: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 i jest 1024 x 1024 w naszym przypadku.

  • -r 15: próbkowanie FPS.

    Na przykład oryginalny film miał 30 klatek na sekundę, co -r 15oznacza, że ffmpegwybierze jedną klatkę na każde 2 ( = 30 / 15).

    Jednak postrzegana moc wyjściowa FPS jest dopasowywana do danych wejściowych, więc nie zauważysz przyspieszenia, a jedynie większą ziarnistość.

    Wejściowy FPS można znaleźć za pomocą ffprobe, a całkowitą liczbę ramek wejściowych można znaleźć za pomocą mediainfowyjaśnienia na stronie : https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -w-a-video-on-the-linux-command-line / 1044894 # 1044894

    Polecam tę opcję, ponieważ formaty wideo mają zwykle wyższą szybkość klatek ze względu na większą rozdzielczość. W przypadku mniejszych plików GIF niższa liczba klatek na sekundę jest mniej zauważalna, dlatego możemy pomijać niektóre klatki i tworzyć mniejsze pliki GIF.

Przed 18.04: ffmpeg+ convertjedna linijka bez plików pośrednich

ffmpegnie mógł wcześniej obsługiwać GIF-ów. Najlepsze, co miałem, to coś takiego:

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

Wyjaśnienie niektórych argumentów:

Nawet jeśli zmniejszysz wysokość i liczbę klatek na sekundę, wyjściowy plik GIF może być nadal większy niż wideo, ponieważ „prawdziwe” formaty wideo inne niż GIF kompresują się między ramkami, podczas gdy GIF kompresuje tylko pojedyncze klatki.

Bezpośredni:

convert input.mp4 rpi2-bare-metal-blink.gif

działało, ale prawie zabiłem mój komputer z powodu przepełnienia pamięci i wytworzyłem wydajność 100 razy większą dla mojego pliku wejściowego 2M 1Mb. Może pewnego dnia ImageMagick dogoni.

Zobacz także: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

Testowane na Ubuntu 17.10.

Ciro Santilli
źródło
1
Downvoters proszę wyjaśnić ;-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
Twoje opóźnienie nie zgadza się z wartością -r (wynikowy gif to 2x szybkość). Dodałeś również argument skali bez wyraźnego powodu (dzięki temu gif jest naprawdę mały).
asmeurer
2
Zgadzam się. Małe gify są lepsze dla sieci. Dzięki za scale=320:-1
zombie
2
Dla tych, którzy zastanawiają się: usunięcie -r 10przywróci GIF do normalnej prędkości.
Mitch
2
Mam gif 20% większy niż mp4: O
Adam Goldman
113

Dwa kroki:

  • Wyodrębnij obrazy z wideo

    Utwórz katalog o nazwie ramki w tym samym katalogu ze swoim .mp4plikiem. Użyj polecenia:

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    źródło

  • Konwertuj obrazy na gif

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    Dokumenty: konwersja opcji gif

Skończysz z dość dużym plikiem, spójrz na przewodnik magii obrazu, aby zoptymalizować gif na temat opcji, które możesz dodać do polecenia drugiego kroku, aby uzyskać mniejszy plik.

Maythux
źródło
1
świetna odpowiedź - dodatkowe informacje: ffmpeg można zainstalować, korzystając ze wskazówek tutaj
chepyle
3
Pamiętaj, że framesfolder musi istnieć, aby pierwsze polecenie działało.
totymedli
3
Dla tych, którzy chcą szybkiego sposobu optymalizacji, który ogólnie działa i są zbyt leniwi, aby przeczytać link, po prostu dodaj -layers Optimizepoprzednią convertkomendę *.jpg. Sprawdź jednak dane wyjściowe, może to mieć wpływ. Dla mnie zmniejszyłem rozmiar
gifu
Dzięki temu, że był to interesujący proces, 5,6 MB mp4 skończyło się 236 MB gifem, nie jestem pewien, czy umieszczę go na mojej stronie internetowej;) Być może gif musi być ograniczony do sekund, a nie minut.
kardamon kardamon
2
Zamiast używać formatu pliku JPG, bardzo stratnego z ustawieniami domyślnymi, zalecałbym użycie PNG do początkowego eksportu pliku. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F,
12

gifify to wszechstronne narzędzie oparte na węzłach, które upraszcza konwersję. To zależy od tego nodejs, npm, ffmpeg, i imagemagickktóre są dostępne w repo.

Po npmzainstalowaniu możesz zainstalować gififyglobalnie za pomocą:

    npm install -g gifify

Wideo można przekonwertować na format .GIF za pomocą:

    gifify video.mp4 -o video.gif

Możesz również opcjonalnie ustawić pozycję początkową i końcową w filmie i dodać podpis tekstowy:

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

For Konwersja może potrwać kilka minut, nawet w przypadku mniejszych filmów.

UWAGA: ffmpegi imagemagickmoże wymagać kompilacji z niektórymi konkretnymi bibliotekami (tj. Odpowiednio libass i fontconfig).

ccpizza
źródło
Nie obsługuje ok.> 40 sekund klipów: github.com/vvo/gifify/issues/99
oligofren
19.04: Kolejnym wymaganym pakietem jest gifsicle, ale potem pojawia się inny problem: github.com/vvo/gifify/issues/95 Ponadto, czy mógłbyś nam powiedzieć nowicjuszom npm w jakim katalogu uruchomić npm installi czy uruchomić go jako root, czy nie? Dzięki!
Nicolas Raoul,