¿Cómo puedo obtener ffmpeg para convertir un .mov en un .gif?

99

Estoy tratando de convertir un .mov a un .gif y no estoy teniendo éxito.

Aquí está el error:

ffmpeg -pix_fmt rgb24 -i yesbuddy.mov output.gif
ffmpeg version 0.11.1 Copyright (c) 2000-2012 the FFmpeg developers
  built on Jun 12 2012 17:47:34 with clang 2.1 (tags/Apple/clang-163.7.1)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/0.11.1 --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-libfreetype --cc=/usr/bin/clang --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libass --enable-libvo-aacenc --disable-ffplay
  libavutil      51. 54.100 / 51. 54.100
  libavcodec     54. 23.100 / 54. 23.100
  libavformat    54.  6.100 / 54.  6.100
  libavdevice    54.  0.100 / 54.  0.100
  libavfilter     2. 77.100 /  2. 77.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Option pixel_format not found.

Si dejo de lado la parte -pix_fmt rgb24, se queja. ¿Pensamientos sobre cómo arreglarlo?

Daniel Fischer
fuente
3
Para su información, hay una excelente solución para las conversiones de alta calidad dados aquí .
ryanjdillon

Respuestas:

161

El orden de los argumentos de la línea de comando es importante. Esta línea de comando debería funcionar pero generará un archivo gigante:

ffmpeg -i yesbuddy.mov -pix_fmt rgb24 output.gif

Tenga en cuenta que probablemente desee reducir la velocidad de fotogramas y el tamaño cuando realice la conversión, así como especificar una hora y duración de inicio. Probablemente no desee convertir todo el archivo a su resolución original y velocidad de cuadros.

ffmpeg -ss 00:00:00.000 -i yesbuddy.mov -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif

El tamaño del archivo seguirá siendo enorme. Puede utilizar el optimizador GIF de ImageMagick para reducir el tamaño:

convert -layers Optimize output.gif output_optimized.gif
Por favor levantese
fuente
3
Respuesta increíble, gracias :) GIF es un formato loco ... ¡el .mov original era de 250k, el .gif convertido de ffmpeg era de 8mb, y la convertversión optimizada era de 10k asombrosos! ¡Impresionante!
TooTallNate
19
ffmpeg se queja del formato de píxel y cambia de rgb24 a pal8; ¿Debería actualizarse el comando en la respuesta?
user1071136
77
Formato de píxel incompatible 'rgb24' para códec 'gif'
alto mantenimiento
1
@Andy se corrigió automáticamente a rgb8 en mi versión de ffmpeg.
James Campbell
¿Cómo hacer en Android?
Ajay Shrestha
12

Después de convertir:

ffmpeg -i input.mp4 input.gif 

Intente optimizar marcos:

convert input.gif -verbose -coalesce -layers OptimizeFrame input_optframe.gif

Y use gifsiclepara hacer la optimización final:

gifsicle -O2 input_optframe.gif -o optimized.gif

¡Obtuve 6.8mb GIF desde un video de 12.2mb con casi la misma calidad!

Aleksey Kozhevnikov
fuente
3
¿Te importaría explicar cómo funcionan estos pasos y qué están haciendo?
Raystafarian
10

Creé una herramienta que agrupa FFmpeg, ImageMagick y giflossy en un único programa de línea de comandos fácil de usar que puede instalar en una línea: https://github.com/vvo/gifify

Recomiendo a cualquiera que esté dispuesto a convertir videos => GIF para usarlo en lugar de tratar de pasar mucho tiempo navegando en 3 sitios web de documentación para comprender cómo cambiar el tamaño del GIF o cambiar la hora de inicio / finalización.

vvo
fuente
1
Y si tiene Docker ejecutándose en su máquina, simplemente haga un alias así: alias gifify='docker run -it --rm -v $(pwd):/data maxogden/gifify'luego gifify screencast.mkv -o screencast.gif --resize 800:-1
úselo
2
ffmpeg -y -i input.mp4 -f image2pipe -vcodec ppm - | convert -delay 2 -loop 0 -layers Optimize - gif:- | gifsicle -d 3 -O3 -o optimized.gif

primero use ffmpeg para convertir el archivo mp4 a imágenes a través de pipe, luego use imagemagick para comprimirlo a gif, finalmente optimícelo con gifsicle

No sé por qué usar gifscicle directamente no funcionará.

o puedes hacer el gif más pequeño con esto

convert -dither none -matte -depth 8 -deconstruct -layers optimizePlus -colors 32 in.gif out.gif
Shuman
fuente