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

75

Voglio creare un .gif animato da un video .mp4 . Preferirei farlo dalla riga di comando, quindi per favore elenca solo gli strumenti da riga di comando.

    
posta Maythux 15.07.2015 - 10:01

3 risposte

89

Due passaggi:

  • Estrai immagini dal video

    Crea una directory chiamata frame nella stessa directory con il tuo file .mp4 . Usa 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 opzioni gif

Finirai con un file piuttosto grande, dai un'occhiata alla guida di immagini magick per ottimizzare le GIF su opzioni che puoi aggiungere al comando del secondo passaggio per ottenere un file più piccolo.

    
risposta data Maythux 15.07.2015 - 10:01
64

ffmpeg + convert one-liner senza file intermedi

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

ha prodotto l'output rapidamente e con una dimensione ragionevole rispetto a quella del file di input.

Fonte: link

Spiegazione di alcuni argomenti:

  • -r 10 : campionamento FPS. Quindi, ad esempio, se il video originale aveva 30 FPS, -r 10 significa che ffmpeg sceglierà un fotogramma ogni 3. L'input FPS può essere trovato con ffprobe , e il numero totale di fotogrammi di input può essere trovato con mediainfo come spiegato a: link Un valore relativamente basso come 10 significherà meno frame di output e quindi GIF più piccoli. TODO alcuni

  • -loop 0 : aggiungi l'estensione Netscape Gif conteggio dei cicli all'output. 0 significa loop infinito come descritto in: link eog , firefox e chromium tutto loop infinitamente per impostazione predefinita anche senza di esso, quindi non sono sicuro di quanto sia necessario.

  • -delay 5 : tempo atteso prima di mostrare il fotogramma successivo, in centinaia di secondi, come descritto in: link byte 324. Quindi 100 significa 1 FPS, 5 significa 1 / 0.5 == 20FPS .

Altri argomenti opzionali che probabilmente vorrai:

  • ffmpeg -vf scale=320:-1 : crea l'output 320 pixel in altezza. Questo è un caso comune per le GIF per il web. Se rimuovi questa opzione, la GIF di output ha la stessa altezza del video di input. L'altezza originale può essere trovata ad esempio con ffprobe : link e l'output con identify .

  • ffmpeg -ss 00:02:26 -to 00:02:36 : converti solo il video da 02 minuti a 26 secondi a 02 minuti e 36 secondi. Vedi anche: link

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.

A direct:

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 100x più grande per il mio file di input da 1Mb 2s. Forse un giorno ImageMagick lo raggiungerà.

Testato su Ubuntu 17.10.

    
8

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

Una volta installato npm , puoi installare gifify a livello globale con:

    npm install -g gifify

Un video può essere convertito in un file .GIF con:

    gifify video.mp4 -o video.gif

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

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

❗️ Potrebbero essere necessari diversi minuti per completare la conversione anche con video più piccoli.

  

NOTA: potrebbe essere necessario compilare ffmpeg e imagemagick con alcune librerie specifiche (ad esempio, libass e fontconfig di conseguenza).

    
risposta data ccpizza 03.09.2017 - 21:44

Leggi altre domande sui tag