Quiero hacer una animación .gif
de un .mp4
video. Preferiría hacerlo desde la línea de comandos, así que solo enumere las herramientas de línea de comandos.
Quiero hacer una animación .gif
de un .mp4
video. Preferiría hacerlo desde la línea de comandos, así que solo enumere las herramientas de línea de comandos.
Respuestas:
ffmpeg
3.4.4 puede hacerlo directamente en Ubuntu 18.04
Es probable que desee usar algo como:
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
Pruebe el procedimiento de generación de datos descrito en esta publicación .
Un más directo:
sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif
también funciona, pero el GIF de salida sería mucho más grande que el video de entrada, porque los formatos de video se comprimen de manera inteligente a través de los cuadros.
Desglose de argumentos:
ulimit -Sv 1000000
: establece un tamaño de memoria máximo de 1 Gb para el programa.
Principalmente me aseguro de que el comando no esté usando memoria ilimitada como ciertos intentos anteriores.
500 Mb hace que ffmpeg no pueda cargar las bibliotecas compartidas ... ¿es hora de actualizar su RAM?
-ss 00:00:03 -to 00:00:06
: hora de inicio y finalización para cortar el video.
No, los GIF no son la mejor manera de piratear distribuir videos en línea.
Ver también: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg
-vf scale=512:-1
: crea los 512
píxeles de salida en altura y ajusta el ancho para mantener la relación de aspecto.
Este es un caso de uso común para imágenes para la web, que tienden a tener una resolución mucho menor que el video.
Si elimina esta opción, el GIF de salida tiene la misma altura que el video de entrada.
La altura del video original se puede encontrar, por ejemplo, con ffprobe
: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 y es 1024 x 1024 en nuestro caso.
-r 15
: muestreo de FPS.
Por ejemplo, el video original era de 30 FPS, lo -r 15
que significa que ffmpeg
elegirá un cuadro por cada 2 ( = 30 / 15
).
Sin embargo, el FPS de salida percibido se ajusta para que coincida con la entrada, por lo que no notará una aceleración, solo una mayor granularidad.
El FPS de entrada se puede encontrar con ffprobe
, y el número total de cuadros de entrada se puede encontrar mediainfo
como se explica en: https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -en-a-video-on-the-linux-command-line / 1044894 # 1044894
Recomiendo esta opción porque los formatos de video generalmente tienen una velocidad de fotogramas más alta debido a la mayor resolución. Con GIF más pequeños, la velocidad de fotogramas más baja es menos notable, por lo que podemos omitir algunos fotogramas y hacer GIF más pequeños.
Antes de 18.04 anterior: ffmpeg
+ convert
one-liner sin archivos intermedios
ffmpeg
No se pudo manejar GIF anteriormente. Lo mejor que tuve fue algo:
sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
convert -delay 5 -loop 0 - output.gif
Explicación de algunos de los argumentos:
-loop 0
: agregue el campo de recuento de bucles de la extensión Netscape Gif a la salida. 0 significa bucle infinito como se describe en: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eog
, firefox
y el cromo todos los bucles infinitos por defecto, incluso sin él, así que no estoy seguro de lo necesario es más.
-delay 5
: tiempo esperado antes de mostrar el siguiente cuadro, en centésimas de segundo, como se describe en: https://en.wikipedia.org/wiki/GIF#Animated_GIF byte 324. Entonces 100
significa 1 FPS, 5
significa 1 / 0.5 == 20FPS
.
Incluso si reduce la altura y la velocidad de fotogramas, el GIF de salida aún puede ser más grande que el video, ya que los formatos de video "reales" que no son GIF se comprimen en fotogramas, mientras que GIF solo comprime fotogramas individuales.
Directo:
convert input.mp4 rpi2-bare-metal-blink.gif
funcionó, pero casi mato mi computadora debido al desbordamiento de memoria, y produjo una salida 100 veces más grande para mi archivo de entrada de 2M 1Mb. Tal vez algún día ImageMagick se pondrá al día.
Ver también: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality
Probado en Ubuntu 17.10.
scale=320:-1
-r 10
devolverá el GIF a la velocidad normal.
Dos pasos:
Extraer imágenes del video
Cree un directorio llamado marcos en el mismo directorio con su .mp4
archivo. Usar 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
Documentos: convertir opciones de gif
Terminará con un archivo bastante grande, eche un vistazo a la guía de imágenes mágicas para optimizar las opciones de gif que puede agregar al comando del segundo paso para obtener un archivo más pequeño.
frames
carpeta debe existir para que el primer comando funcione.
-layers Optimize
el último convert
comando, antes *.jpg
. Sin embargo, verifique la salida, podría verse afectada. Para mí, redujo el tamaño de gif de 5 MB a 700 KB sin ninguna pérdida perceptible en calidad :)
ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'
.
gifify es una utilidad todo en uno basada en nodos que simplifica la conversión. Depende nodejs
, npm
, ffmpeg
, y imagemagick
que están disponibles en los repositorios.
Una vez que lo haya npm
instalado, puede instalarlo gifify
globalmente con:
npm install -g gifify
Un video se puede convertir a .GIF con:
gifify video.mp4 -o video.gif
También puede establecer opcionalmente una posición de inicio y finalización en el video y agregar un título de texto:
gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'
❗️ La conversión puede tardar varios minutos en completarse incluso con videos más pequeños.
NOTA:
ffmpeg
y esimagemagick
posible que deba compilarse con algunas bibliotecas específicas (es decir, libass y fontconfig en consecuencia).
gifsicle
, pero luego ocurre otro problema: github.com/vvo/gifify/issues/95 Además, ¿le importaría decirnos a los novatos de npm en qué directorio ejecutar npm install
y si ejecutarlo como root o no? ¡Gracias!