Como posso obter o ffmpeg para converter um .mov em um .gif?

99

Estou tentando converter um .mov em um .gif e não estou tendo sucesso.

Aqui está o erro:

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.

Se eu deixar de fora a parte -pix_fmt rgb24, ela reclama. Pensamentos sobre como consertar?

Daniel Fischer
fonte
3
Para sua informação, existe uma excelente solução para conversões de alta qualidade fornecidas aqui .
Ryanjdillon 28/03/14

Respostas:

161

A ordem dos argumentos da linha de comando é importante. Essa linha de comando deve funcionar, mas irá gerar um arquivo gigante:

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

Observe que você provavelmente deseja reduzir a taxa de quadros e o tamanho ao converter, além de especificar um horário e duração de início. Você provavelmente não deseja converter o arquivo inteiro em sua resolução e taxa de quadros originais.

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

O tamanho do arquivo ainda será enorme. Você pode usar o otimizador de GIF do ImageMagick para reduzir o tamanho:

convert -layers Optimize output.gif output_optimized.gif
PleaseStand
fonte
3
Resposta impressionante, obrigado :) O GIF é um formato louco ... o .mov original tinha 250k, o .gif convertido do ffmpeg tinha 8mb e a convertversão otimizada era um impressionante 10k! Impressionante!
precisa saber é o seguinte
19
O ffmpeg reclama do formato de pixel e muda de rgb24 para pal8; o comando na resposta deve ser atualizado?
user1071136
7
Formato de pixel incompatível 'rgb24' para codec 'gif'
highmaintenance
1
@ Andy corrigido automaticamente para rgb8 na minha versão do ffmpeg.
James Campbell
como fazer no Android?
precisa
12

Após a conversão:

ffmpeg -i input.mp4 input.gif 

Tente otimizar quadros:

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

E use gifsiclepara fazer a otimização final:

gifsicle -O2 input_optframe.gif -o optimized.gif

Tem 6,8mb GIF de 12,2mb de vídeo com quase a mesma qualidade!

Aleksey Kozhevnikov
fonte
3
Se importa em explicar como essas etapas funcionam e o que estão fazendo?
Raystafarian #
10

Criei uma ferramenta que agrupa FFmpeg, ImageMagick e giflossy em um único programa de linha de comando fácil de usar que você pode instalar em uma linha: https://github.com/vvo/gifify

Eu recomendo que qualquer pessoa disposta a transformar videos => GIF para usá-lo, em vez de tentar gastar muito tempo navegando em 3 sites de documentação para entender como redimensionar o GIF ou alterar a hora de início / término.

vvo
fonte
1
E se você tiver o Docker em execução em sua máquina, faça um apelido assim: alias gifify='docker run -it --rm -v $(pwd):/data maxogden/gifify'use-o #gifify screencast.mkv -o screencast.gif --resize 800:-1
sabbour
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

primeiro use o ffmpeg para converter arquivos mp4 em imagens via pipe e use o imagemagick para compactá-lo em gif e, finalmente, otimizado com gifsicle

Não sei por que usar o gifscicle diretamente não funciona.

ou você pode diminuir o gif dessa

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