Ответы:
Вот что сработало для меня:
ffmpeg -i animated.gif -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" video.mp4
movflags - эта опция оптимизирует структуру файла MP4, поэтому браузер может загрузить его как можно быстрее.
pix_fmt - MP4 видео хранит пиксели в разных форматах. Мы включаем эту опцию, чтобы указать конкретный формат, который имеет максимальную совместимость во всех браузерах.
vf - MP4-видео, использующие H.264, должны иметь размеры, кратные 2. Этот параметр гарантирует, что это так.
Источник: http://rigor.com/blog/2015/12/optimizing-animated-gifs-with-html5-video
scale
на crop
), так как вы собираетесь обрезать максимум 1 пиксель. Масштабирование может сделать вещи размытыми
В моем случае использование ffmpeg
напрямую помогло и дало лучший результат:
$ ffmpeg -f gif -i infile.gif outfile.mp4
Если вы хотите сделать вывод в «n циклов» , посмотрите на это решение в один выстрел
Итак, давайте конвертируем normal.gif в loop.mp4
для фильма 2 петли пример:
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
для фильма с 5 циклами:
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
БУДЬТЕ ВНИМАТЕЛЬНЫ: есть -y [для перезаписи]
ffmpeg
команду без -y
, у вас будет гораздо меньше шансов случайно перезаписать то, что вы не хотите. (Есть также, вероятно, способ заставить ffmpeg
видео транслироваться в себя, и сделать это одной конвейерной командой без промежуточного файла и перезаписи.)
Версия MacOs выглядит следующим образом:
$ ffmpeg -i input.avi -pix_fmt yuv420p output.mp4