Como faço para converter um gif animado em um mp4 ou mv4 na linha de comando?

79

Qual comando eu usaria para converter um arquivo de vídeo mp4 ou mv4 em um gif animado e vice-versa. Ou seja, converta um gif animado em um mp4 ou mv4.

Gilles
fonte

Respostas:

108

Aqui está o que funcionou para mim:

ffmpeg -i animated.gif -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" video.mp4

movflags - Esta opção otimiza a estrutura do arquivo MP4 para que o navegador possa carregá-lo o mais rápido possível.

pix_fmt - vídeos MP4 armazenam pixels em diferentes formatos. Incluímos essa opção para especificar um formato específico com compatibilidade máxima em todos os navegadores.

vf - vídeos MP4 usando H.264 precisam ter dimensões que podem ser divididas por 2. Essa opção garante que esse seja o caso.

Fonte: http://rigor.com/blog/2015/12/optimizing-animated-gifs-with-html5-video

Vico Vault
fonte
4
Obrigado, esta é a única versão que funcionou para mim no osx.
Pykler
1
Isso funcionou para mim no Ubuntu 16.10 com ffmpeg 3.0.2, onde a resposta principal não aconteceu #
cat
1
Também é possível cortar em vez de escalar (substituir scalepor crop), pois você só cortará no máximo 1 pixel. Scaling pode tornar as coisas desfocadas
Jezzamon
Isso cortou os últimos segundos para mim. O mp4 resultante terminou mais cedo.
Callum
38

No meu caso, usar ffmpegdiretamente fez o truque e forneceu o melhor resultado:

$ ffmpeg -f gif -i infile.gif outfile.mp4
BenC
fonte
2
produzido um vídeo em branco (danificado) nos X
Pykler
2
@ Pykler, você provavelmente deve aumentar a verbosidade e / ou verificar o arquivo de log para entender o que está acontecendo.
BenC 17/07/19
Eu também, provavelmente o "divisível por 2 dimensões" sugerido na resposta de vico Vault. (que funcionou para mim)
lapo 24/10
Este método funcionou perfeitamente para mim. (A resposta superior causada 3 segundos para ser cortado no final.) EDIT: oh, mas não jogar no iOS :(
callum
Uma página da web diz que você deve apenas adicionar -pix_fmt yuv420p
beefeather
2

Outra maneira de converter animação GIF em vídeo:

ffmpeg -i your_gif.gif -c:v libvpx -crf 12 -b:v 500K output.mp4

Os valores -crf podem ir de 4 a 63. Valores mais baixos significam melhor qualidade. -b: v é a taxa de bits máxima permitida. Maior significa melhor qualidade.

user8547
fonte
2

Se você deseja fazer a saída em "n loops" , observe esta solução de uma só vez

Então, vamos converter um normal.gif para loop.mp4

para 2 loops exemplo de filme:

ffmpeg -stream_loop 2 -i normal.gif loop.gif -y;ffmpeg -i loop.gif -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" loop.mp4 -y

para 5 loops exemplo de filme:

ffmpeg -stream_loop 5 -i normal.gif loop.gif -y;ffmpeg -i loop.gif -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" loop.mp4 -y

ATENÇÃO: existe um -y [para substituir]

PYK
fonte
Se você executar o primeiro ffmpegcomando sem -y , terá muito menos chances de substituir acidentalmente algo que não deseja. ( Provavelmente também há uma maneira de ffmpegcanalizar o vídeo para si mesmo e fazer isso em um comando canalizado, sem o arquivo intermediário e a substituição).
FeRD