MP4 videodan komut satırı aracılığıyla bir animasyonlu GIF nasıl oluşturulur?


119

.gifBir .mp4videodan bir animasyon yapmak istiyorum . Bunu komut satırından yapmayı tercih ederim, bu yüzden lütfen yalnızca komut satırı araçlarını listeleyin.


Bu betiği FFMPEG kullanan ve daha iyi görüntü kalitesi için ara renk paleti üreten Github'da kullanabilirsiniz .
troyane

Yanıtlar:


128

ffmpeg 3.4.4 doğrudan Ubuntu 18.04 üzerinden yapabilir

Muhtemelen şöyle bir şey kullanmak istersiniz:

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

Bu gönderide açıklanan test veri oluşturma prosedürü .

Daha doğrudan:

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

ayrıca çalışır, ancak GIF çıkışı giriş videosundan çok daha büyük olur çünkü video formatları kareler arasında akıllıca sıkıştırma yapar.

Argüman dağılımı:

  • ulimit -Sv 1000000: program için maksimum 1 Gb hafıza boyutu ayarlayınız.

    Çoğunlukla ben komutun önceki girişimlerdeki gibi sınırsız bellek kullanmamasını sağlıyorum.

    500 Mb, ffmpeg'in paylaşılan kütüphaneleri yüklemesini engeller ... RAM'inizi yükseltme zamanı?

  • -ss 00:00:03 -to 00:00:06: Videoyu kesmek için başlama ve bitiş zamanı.

    Hayır, GIF için en iyi yol değildir korsan çevrimiçi videoları dağıtmak.

    Ayrıca bakınız: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg

  • -vf scale=512:-1: çıktı 512piksellerini yüksekliğe getirin ve en boy oranını korumak için genişliği ayarlayın.

    Bu, web’deki görüntüler için, videodan çok daha küçük çözünürlüğe sahip olma eğiliminde olan yaygın bir kullanım durumudur.

    Bu seçeneği kaldırırsanız, GIF çıkışı giriş videosuyla aynı yüksekliğe sahiptir.

    Orijinal video yüksekliği ile örneğin bulunabilir ffprobe: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 ve olduğu Bizim durumumuzda 1024 x 1024.

  • -r 15: örnekleme FPS.

    Örneğin, orijinal video 30 FPS idi, bu nedenle her 2 ( ) 'de bir kare seçeceği -r 15anlamına geliyor .ffmpeg= 30 / 15

    Algılanan FPS çıkışı, girişle eşleşecek şekilde ayarlanmıştır, böylece bir hızlanma, yalnızca daha büyük ayrıntı dereceleri fark etmezsiniz.

    FPS girişi ile bulunabilir ffprobeve toplam giriş çerçevesi sayısı mediainfoaçıklandığı şekilde bulunabilir : https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -in-a-video-on-the-linux-komut satırı / 1044894 # 1044894

    Bu seçeneği öneririm, çünkü video formatları daha büyük çözünürlük nedeniyle genellikle daha yüksek kare hızına sahiptir. Küçük GIF'lerde, düşük kare hızı daha az fark edilir ve bu nedenle bazı kareleri atlayıp daha küçük GIF'ler yapabiliriz.

18.04 öncesi öncesi: ffmpeg+ convertara dosya içermeyen bir astar

ffmpegGIF önceden işlenemedi. Sahip olduğum en iyi şey bir şeydi:

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

Bazı argümanların açıklaması:

Yüksekliği ve kare hızını azaltsanız bile, GIF çıkışı videodan daha büyük olabilir, çünkü "gerçek" GIF olmayan video biçimleri kareler arasında sıkıştırırken GIF yalnızca bireysel kareleri sıkıştırır.

Doğrudan:

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

çalıştı, ancak neredeyse bilgisayarımın taşması nedeniyle bilgisayarımı öldürdü ve 2s 1Mb giriş dosyam için 100 kat daha fazla çıkış üretti. Belki bir gün ImageMagick yakalar.

Ayrıca bakınız: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

Ubuntu 17.10'da test edilmiştir.


1
Katılanlar lütfen açıklayınız ;-)
Ciro Santilli

1
Gecikmeniz -r değerinize uymuyor (sonuçtaki gif 2x hızda). Ayrıca, belirgin bir sebep olmadan bir ölçek argümanı eklediniz (bu, gif'i gerçekten küçük yapar).
asmeurer

2
Katılıyorum. Küçük boyutlu gifler web için daha iyidir. Teşekkürler scale=320:-1
zombic 26:16

2
Merak edenler için: sökmek -r 10GIF'i normal hızına getirecektir.
Mitch,

2
Mp4'ten% 20 daha büyük bir gif aldım: O
Adam Goldman

113

İki adım:

  • Videodan Görüntüleri Çıkar

    .mp4Dosyanızla aynı dizinde çerçeveler adı verilen bir dizin oluşturun . Komutunu kullanın:

    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
    

    kaynak

  • Görüntüleri gif'e çevir

    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
    

    Dokümanlar: gif seçeneklerini dönüştür

Oldukça büyük bir dosya ile sonlanacak, daha küçük bir dosya elde etmek için ikinci adım komutuna ekleyebileceğiniz seçenekleri optimize etmek için görüntü magick kılavuzuna bir göz atacaksınız .


1
harika cevap - bazı ek bilgiler: ffmpeg buradaki
chepyle

3
framesİlk komutun çalışması için klasörün var olması gerektiğini unutmayın .
totymedli

3
Genelde en iyisi işe yarayan ve bağlantıyı okumak için çok tembel olan, optimize etmek için hızlı bir yol isteyenler için, sadece -layers Optimizeönceki son convertkomutu ekleyin *.jpg. Çıkışı kontrol et, etkilenmiş olabilir. Benim için gif boyutunu 5 MB'tan 700 KB'a
düşürdüler

Bu ilginç bir süreç oldu, 5.6 MB mp4 236 MB gif verdi, bunu web siteme koyacağımdan emin değilim;) Muhtemelen bir gifin bir dakika yerine saniyelerle sınırlı kalması gerekiyor.
kakule

2
JPG dosya biçimini kullanmak yerine, varsayılan ayarlarla çok kayıplıdır, ilk dosya dışa aktarımı için PNG kullanmanızı öneririm. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F,

12

gifify , dönüştürmeyi basitleştiren hepsi bir arada düğüm tabanlı bir yardımcı programdır. Bu bağlıdır nodejs, npm, ffmpegve imagemagicktüm depolarındakii hangi.

Kurduktan sonra global olarak npmaşağıdakileri kurabilirsiniz gifify:

    npm install -g gifify

Bir video şu şekilde bir .GIF'e dönüştürülebilir:

    gifify video.mp4 -o video.gif

İsteğe bağlı olarak videoda bir başlangıç ​​ve bitiş konumu ayarlayabilir ve bir metin başlığı ekleyebilirsiniz:

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

Smaller️ Dönüşümün daha küçük videolarla bile tamamlanması birkaç dakika sürebilir.

NOT: ffmpegve imagemagickbazı özel kütüphanelerle derlenmesi gerekebilir (yani, buna göre libass ve fontconfig).


Yaklaşık> 40 saniyelik klipleri işlemez
oligofren

19.04: Gereken başka bir paket var gifsicle, fakat sonra başka bir sorun ortaya çıkıyor: github.com/vvo/gifify/issues/95 Ayrıca, npm acemilerine hangi dizinde çalışacağını npm installve kök olarak çalıştırıp çalıştırmayacağımızı söyler misiniz ? Teşekkürler!
Nicolas Raoul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.