¿Cómo crear un GIF animado a partir de video MP4 a través de la línea de comandos?

119

Quiero hacer una animación .gifde un .mp4video. Preferiría hacerlo desde la línea de comandos, así que solo enumere las herramientas de línea de comandos.

Maythux
fuente
Puede usar este script en Github que usa FFMPEG y genera una paleta de colores intermedia para una mejor calidad de imagen.
Troyane

Respuestas:

128

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 512pí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 15que significa que ffmpegelegirá 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 mediainfocomo 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+ convertone-liner sin archivos intermedios

ffmpegNo 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:

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.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
1
Votantes por favor expliquen ;-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
Su retraso no coincide con su valor -r (el gif resultante es 2x velocidad). También agregaste un argumento de escala sin razón aparente (hace que el gif sea realmente pequeño).
asmeurer
2
Estoy de acuerdo. Los gifs de tamaño pequeño son mejores para la web. Gracias por scale=320:-1
zombic
2
Para aquellos que se preguntan: la eliminación -r 10devolverá el GIF a la velocidad normal.
Mitch
2
Tengo un gif 20% más grande que el mp4: O
Adam Goldman
113

Dos pasos:

  • Extraer imágenes del video

    Cree un directorio llamado marcos en el mismo directorio con su .mp4archivo. 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
    

    fuente

  • Convertir imágenes a 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
    

    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.

Maythux
fuente
1
gran respuesta: información adicional: ffmpeg se puede instalar siguiendo las instrucciones aquí
chepyle
3
Tenga en cuenta que la framescarpeta debe existir para que el primer comando funcione.
totymedli
3
Para aquellos que desean una forma rápida de optimizar que generalmente funciona y son demasiado vagos para leer el enlace, simplemente agregue -layers Optimizeel último convertcomando, 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 :)
cpury
Gracias, ese fue un proceso interesante, un mp4 de 5.6MB terminó con un gif de 236MB, no estoy seguro de si lo pondré en mi sitio web;) Posiblemente un gif debe limitarse a segundos en lugar de un minuto.
cardamomo
2
En lugar de usar el formato de archivo JPG, muy perdido con la configuración predeterminada, recomendaría usar PNG para la exportación inicial del archivo. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F
12

gifify es una utilidad todo en uno basada en nodos que simplifica la conversión. Depende nodejs, npm, ffmpeg, y imagemagickque están disponibles en los repositorios.

Una vez que lo haya npminstalado, puede instalarlo gififyglobalmente 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: ffmpegy es imagemagickposible que deba compilarse con algunas bibliotecas específicas (es decir, libass y fontconfig en consecuencia).

ccpizza
fuente
No maneja clips de aproximadamente> 40 segundos: github.com/vvo/gifify/issues/99
oligofren
19.04: Otro paquete requerido es 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 instally si ejecutarlo como root o no? ¡Gracias!
Nicolas Raoul