Как мне преобразовать анимированный GIF в MP4 или MV4 в командной строке?

79

Какую команду я бы использовал для преобразования видеофайла в формате mp4 или mv4 в анимированный GIF-файл и наоборот. То есть конвертируем анимированный gif в mp4 или mv4.

жилль
источник

Ответы:

109

Вот что сработало для меня:

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

Vico Vault
источник
4
Спасибо, это единственная версия, которая работала для меня на OSX.
Пиклер
1
Это сработало для меня в Ubuntu 16.10 с ffmpeg 3.0.2, где лучший ответ не получился
кошка,
1
Можно также обрезать вместо масштабирования (заменить scaleна crop), так как вы собираетесь обрезать максимум 1 пиксель. Масштабирование может сделать вещи размытыми
Jezzamon
Это отрезало мне последние несколько секунд. Результирующий mp4 закончился рано.
Каллум
38

В моем случае использование ffmpegнапрямую помогло и дало лучший результат:

$ ffmpeg -f gif -i infile.gif outfile.mp4
BENČ
источник
2
произвел
чистое
2
@Pykler Вы, вероятно, должны увеличить многословие и / или проверить файл журнала, чтобы понять, что происходит.
BenC
Я тоже, наверное, «делимый на 2 измерения», предложенный в ответе Vio Vault. (который работал для меня)
Lapo
Этот метод отлично работал для меня. (Верхний ответ заставил 3 секунды обрезаться до конца.) РЕДАКТИРОВАТЬ: о, но это не играет на iOS :(
callum
На веб-странице написано, что вы должны просто добавить -pix_fmt yuv420p
beefeather
2

Еще один способ конвертировать GIF-анимацию в видео:

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

-crf значения могут быть от 4 до 63. Более низкие значения означают лучшее качество. -b: v - максимально допустимый битрейт. Чем выше, тем лучше.

user8547
источник
2

Если вы хотите сделать вывод в «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 [для перезаписи]

PYK
источник
Если вы выполните первую ffmpegкоманду без -y , у вас будет гораздо меньше шансов случайно перезаписать то, что вы не хотите. (Есть также, вероятно, способ заставить ffmpegвидео транслироваться в себя, и сделать это одной конвейерной командой без промежуточного файла и перезаписи.)
FeRD