Відповіді:
Ось що для мене спрацювало:
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 циклі" , подивіться на це рішення за один кадр
Отже, давайте перетворимо нормальний.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