Respostas:
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
scale
por crop
), pois você só cortará no máximo 1 pixel. Scaling pode tornar as coisas desfocadas
No meu caso, usar ffmpeg
diretamente fez o truque e forneceu o melhor resultado:
$ ffmpeg -f gif -i infile.gif outfile.mp4
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]
ffmpeg
comando sem -y
, terá muito menos chances de substituir acidentalmente algo que não deseja. ( Provavelmente também há uma maneira de ffmpeg
canalizar o vídeo para si mesmo e fazer isso em um comando canalizado, sem o arquivo intermediário e a substituição).
A versão MacOs é a seguinte:
$ ffmpeg -i input.avi -pix_fmt yuv420p output.mp4