Come creare una GIF animata dal video MP4 tramite riga di comando?


119

Voglio fare un animato .gifda un .mp4video. Preferirei farlo dalla riga di comando, quindi per favore elenca solo gli strumenti della riga di comando.


È possibile utilizzare questo script su Github che utilizza FFMPEG e genera una tavolozza di colori intermedia per una migliore qualità dell'immagine.
troyane,

Risposte:


128

ffmpeg 3.4.4 può farlo direttamente su Ubuntu 18.04

Probabilmente vuoi usare qualcosa come:

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

Procedura di generazione dei dati di test descritta in questo post .

Un più diretto:

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

funziona anche, ma l'output GIF sarebbe molto più grande del video in ingresso, poiché i formati video vengono compressi in modo intelligente tra i frame.

Analisi dell'argomento:

  • ulimit -Sv 1000000: imposta una dimensione di memoria massima di 1 GB per il programma.

    Principalmente mi assicuro che il comando non stia utilizzando memoria illimitata come alcuni tentativi precedenti.

    500 Mb impedisce a ffmpeg di caricare le librerie condivise ... non è tempo di aggiornare la RAM?

  • -ss 00:00:03 -to 00:00:06: ora di inizio e fine per tagliare il video.

    No, le GIF non sono il modo migliore per distribuire video online da pirati .

    Vedi anche: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg

  • -vf scale=512:-1: imposta i 512pixel di output in altezza e regola la larghezza per mantenere le proporzioni.

    Questo è un caso d'uso comune per le immagini per il web, che tendono ad avere una risoluzione molto più piccola rispetto al video.

    Se si rimuove questa opzione, la GIF di output ha la stessa altezza del video di input.

    L'altezza del video originale può essere trovata ad esempio con ffprobe: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 ed è 1024 x 1024 nel nostro caso.

  • -r 15: campionamento FPS.

    Ad esempio, il video originale era di 30 FPS, quindi -r 15significa che ffmpegsceglierà un fotogramma ogni 2 ( = 30 / 15).

    L'FPS di output percepito viene regolato in modo da corrispondere all'input, tuttavia non si noterà un aumento di velocità, ma solo una maggiore granularità.

    L'FPS di input può essere trovato con ffprobe, e il numero totale di frame di input può essere trovato mediainfocome spiegato a: https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -in-un-video-on-the-linux-riga di comando / 1044894 # 1044894

    Consiglio questa opzione perché i formati video di solito hanno un framerate più elevato a causa della maggiore risoluzione. Con GIF più piccole, il framerate inferiore è meno evidente, quindi possiamo saltare alcuni frame e creare GIF più piccole.

Prima del 18.04: ffmpeg+ convertone-liner senza file intermedi

ffmpegimpossibile gestire GIF in precedenza. Il meglio che avevo era qualcosa insieme:

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

Spiegazione di alcuni degli argomenti:

Anche se riduci l'altezza e il framerate, la GIF di output potrebbe essere ancora più grande del video, poiché i formati video "reali" non GIF si comprimono attraverso i frame, mentre GIF comprime solo i singoli frame.

Un diretto:

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

ha funzionato, ma ha quasi ucciso il mio computer a causa dell'overflow della memoria e ha prodotto un'output 100 volte più grande per il mio file di input da 2 Mb da 1 MB. Forse un giorno ImageMagick raggiungerà.

Vedi anche: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

Testato su Ubuntu 17.10.



1
Il tuo ritardo non corrisponde al tuo valore -r (la gif risultante è 2x velocità). Inoltre hai aggiunto un argomento di scala senza una ragione apparente (rende la gif davvero piccola).
asmeurer,

2
Sono d'accordo. Le gif di piccole dimensioni sono migliori per il web. Grazie per scale=320:-1
zombic,

2
Per coloro che si chiedono: la rimozione -r 10riporterà la GIF alla velocità normale.
Mitch,

2
Ho ottenuto una gif del 20% più grande di mp4: O
Adam Goldman

113

Due passaggi:

  • Estrai immagini da video

    Crea una directory chiamata frame nella stessa directory con il tuo .mp4file. Usa il comando:

    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
    

    fonte

  • Converti immagini in 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
    

    Documenti: converti le opzioni gif

Ti ritroverai con un file piuttosto grande, dai un'occhiata alla guida alle immagini magiche per ottimizzare gif sulle opzioni che puoi aggiungere al comando del secondo passaggio per ottenere un file più piccolo.


1
ottima risposta- alcune informazioni aggiuntive: ffmpeg può essere installato usando le istruzioni qui
chepyle

3
Tenere presente che la framescartella deve esistere affinché il primo comando funzioni.
totymedli,

3
Per coloro che desiderano un modo rapido per ottimizzare che generalmente funziona e sono troppo pigri per leggere il collegamento, basta aggiungere -layers Optimizeall'ultimo convertcomando, prima *.jpg. Controllare l'output, tuttavia, potrebbe essere interessato. Per me ha ridotto la dimensione gif da 5 MB a 700 KB senza alcuna perdita percettibile di qualità :)
cpury

Grazie è stato un processo interessante, un mp4 da 5,6 MB è finito con un GIF da 236 MB, non sono sicuro che lo metterò sul mio sito Web;) Probabilmente un GIF deve essere limitato a secondi anziché a un minuto.
cardamomo,

2
Invece di utilizzare il formato di file JPG, molto in perdita con le impostazioni predefinite, consiglierei di usare PNG per l'esportazione iniziale del file. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F,

12

gifify è un'utilità basata su nodo all-in-one che semplifica la conversione. Dipende nodejs, npm, ffmpeg, e imagemagickche sono tutti disponibili nei repository.

Una volta npminstallato puoi installarlo a gififylivello globale con:

    npm install -g gifify

Un video può essere convertito in .GIF con:

    gifify video.mp4 -o video.gif

Puoi anche impostare una posizione iniziale e finale nel video e aggiungere una didascalia:

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

❗️ Il completamento della conversione può richiedere diversi minuti anche con video più piccoli.

NOTA: ffmpege imagemagickpotrebbe essere necessario compilare alcune librerie specifiche (ad es. Libass e fontconfig di conseguenza).


Non gestisce clip di circa> 40 secondi: github.com/vvo/gifify/issues/99
oligofren

19.04: Un altro pacchetto richiesto è gifsicle, ma si verifica un altro problema: github.com/vvo/gifify/issues/95 Inoltre, ti dispiacerebbe dirci ai novizi npm in quale directory eseguire npm installe se eseguirlo come root o no? Grazie!
Nicolas Raoul, il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.