Voglio fare un animato .gif
da un .mp4
video. Preferirei farlo dalla riga di comando, quindi per favore elenca solo gli strumenti della riga di comando.
Voglio fare un animato .gif
da un .mp4
video. Preferirei farlo dalla riga di comando, quindi per favore elenca solo gli strumenti della riga di comando.
Risposte:
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 512
pixel 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 15
significa che ffmpeg
sceglierà 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 mediainfo
come 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
+ convert
one-liner senza file intermedi
ffmpeg
impossibile 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:
-loop 0
: aggiungi il campo Conteggio loop estensione Nifcape Gif all'output. 0 significa ciclo infinito come descritto su: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eog
, firefox
e il cromo tutto scorre all'infinito di default anche senza di esso, quindi non sono sicuro di quanto sia necessario è più.
-delay 5
: tempo atteso prima di mostrare il fotogramma successivo, in centinaia di secondi, come descritto su: https://en.wikipedia.org/wiki/GIF#Animated_GIF byte 324. Quindi 100
significa 1 FPS, 5
significa 1 / 0.5 == 20FPS
.
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.
scale=320:-1
-r 10
riporterà la GIF alla velocità normale.
Due passaggi:
Estrai immagini da video
Crea una directory chiamata frame nella stessa directory con il tuo .mp4
file. 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
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.
frames
cartella deve esistere affinché il primo comando funzioni.
-layers Optimize
all'ultimo convert
comando, 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à :)
ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'
.
gifify è un'utilità basata su nodo all-in-one che semplifica la conversione. Dipende nodejs
, npm
, ffmpeg
, e imagemagick
che sono tutti disponibili nei repository.
Una volta npm
installato puoi installarlo a gifify
livello 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:
ffmpeg
eimagemagick
potrebbe essere necessario compilare alcune librerie specifiche (ad es. Libass e fontconfig di conseguenza).
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 install
e se eseguirlo come root o no? Grazie!