Как создать анимированный GIF из видео MP4 через командную строку?

119

Я хочу сделать анимацию .gifиз .mp4видео. Я бы предпочел сделать это из командной строки, поэтому, пожалуйста, перечисляйте только инструменты командной строки.

Maythux
источник
Вы можете использовать этот скрипт на Github, который использует FFMPEG и генерирует промежуточную цветовую палитру для лучшего качества изображения.
Трояне

Ответы:

128

ffmpeg 3.4.4 может сделать это прямо на Ubuntu 18.04

Вы, вероятно, хотите использовать что-то вроде:

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

Процедура генерации тестовых данных описана в этом посте .

Более прямой:

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

также работает, но выходной GIF будет намного больше, чем входное видео, потому что форматы видео сжимаются по кадрам.

Разбивка аргумента:

  • ulimit -Sv 1000000: установить максимальный объем памяти 1 Гб для программы.

    Главным образом я гарантирую, что команда не использует неограниченную память, как некоторые предыдущие попытки.

    500 Мб делает ffmpeg не в состоянии загружать разделяемые библиотеки ... время обновить оперативную память?

  • -ss 00:00:03 -to 00:00:06: время начала и окончания, чтобы вырезать видео.

    Нет, GIF-файлы - не лучший способ пиратского распространения видео в Интернете.

    Смотрите также: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg

  • -vf scale=512:-1: сделать выходные 512пиксели по высоте и отрегулировать ширину, чтобы сохранить соотношение сторон.

    Это частый случай использования изображений в Интернете, которые имеют гораздо меньшее разрешение, чем видео.

    Если вы удалите эту опцию, выходной GIF будет иметь ту же высоту, что и входное видео.

    Исходную высоту видео можно найти, например, по адресуffprobe : https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 и 1024 х 1024 в нашем случае.

  • -r 15: выборка FPS.

    Например, исходное видео было 30 FPS, что -r 15означает, что ffmpegбудет выбирать один кадр из каждых 2 ( = 30 / 15).

    Однако воспринимаемый выходной FPS настраивается так, чтобы соответствовать входному сигналу, поэтому вы не заметите ускорения, только большую детализацию.

    Входной FPS можно найти с помощью ffprobe, а общее количество входных кадров можно найти, mediainfoкак объяснено на: https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -в-видео-на-Linux-командная строка / 1044894 # 1044894

    Я рекомендую эту опцию, потому что видео форматы обычно имеют более высокую частоту кадров из-за большего разрешения. С меньшими GIF-изображениями более низкая частота кадров менее заметна, поэтому мы можем пропускать некоторые кадры и создавать меньшие GIF-изображения.

До pre 18.04: ffmpeg+ convertоднострочник без промежуточных файлов

ffmpegне мог обработать GIF ранее. Лучшее, что у меня было, было кое-что вместе:

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

Объяснение некоторых аргументов:

  • -loop 0: добавьте поле количества циклов расширения Netscape Gif к выводу. 0 означает бесконечный цикл, как описано по адресу: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eog , firefoxа хром все циклы по умолчанию бесконечны даже без него, поэтому я не уверен, насколько это необходимо больше

  • -delay 5: время ожидания до показа следующего кадра, с точностью до секунды, как описано на: https://en.wikipedia.org/wiki/GIF#Animated_GIF, байт 324. Так 100значит 1 FPS, 5значит 1 / 0.5 == 20FPS.

Даже если вы уменьшите высоту и частоту кадров, выходной GIF может все же быть больше, чем видео, поскольку «настоящие» форматы видео, отличные от GIF, сжимают кадры, а GIF сжимает только отдельные кадры.

Прямой:

convert input.mp4 rpi2-bare-metal-blink.gif

работал, но чуть не убил мой компьютер из-за переполнения памяти, и произвел выходную мощность в 100 раз больше для моего входного файла 2s 1Mb. Возможно, однажды ImageMagick наверстает упущенное.

Смотрите также: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

Проверено на Ubuntu 17.10.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
1
Downvoters, пожалуйста, объясните ;-)
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
1
Ваша задержка не соответствует значению -r (результирующий gif равен 2x скорости). Также вы добавили аргумент масштаба без видимой причины (это делает GIF очень маленьким).
asmeurer
2
Я согласен. Маленькие картинки лучше для веб. Спасибо за scale=320:-1
зомби
2
Для тех, кто задается вопросом: удаление -r 10вернет GIF к нормальной скорости.
Митч
2
Я получил GIF на 20% больше, чем mp4: O
Адам Голдман
113

Два шага:

  • Извлечь изображения из видео

    Создайте каталог с именем frames в том же каталоге, что и ваш .mp4файл. Используйте команду:

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    источник

  • Преобразование изображений в GIF

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    Документы: конвертировать GIF-параметры

В итоге вы получите довольно большой файл, посмотрите руководство по магии изображений, чтобы оптимизировать gif для параметров, которые вы можете добавить к команде второго шага, чтобы получить файл меньшего размера.

Maythux
источник
1
отличный ответ - дополнительная информация: ffmpeg можно установить, используя указания здесь
chepyle
3
Имейте в виду, что framesпапка должна существовать для работы первой команды.
Тотимедли
3
Для тех, кому нужен быстрый способ оптимизации, который обычно работает и им лень читать ссылку, просто добавьте -layers Optimizeк последней convertкоманде перед *.jpg. Проверьте вывод, хотя, это может повлиять. Для меня это уменьшило размер gif с 5 МБ до 700 КБ без ощутимой потери качества :)
cpury
Спасибо, что это был интересный процесс, 5,6 МБ mp4 закончились 236 МБ gif, не уверен, что я выложу его на своем сайте;) Возможно, gif нужно ограничить секундами, а не минутой.
кардамон
2
Вместо использования формата файла JPG с большими потерями при настройках по умолчанию, я бы рекомендовал использовать PNG для первоначального экспорта файла. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png',
Пьер Ф
12

gifify - это универсальная утилита на основе узлов, которая упрощает преобразование. Это зависит от того nodejs, npm, ffmpegи imagemagickкоторые все доступны в репозиториях.

После npmустановки вы можете выполнить gififyглобальную установку с помощью:

    npm install -g gifify

Видео может быть преобразовано в .GIF с помощью:

    gifify video.mp4 -o video.gif

Вы также можете дополнительно установить начальную и конечную позицию в видео и добавить текстовую подпись:

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

Conversion Преобразование может занять несколько минут даже для небольших видео.

ПРИМЕЧАНИЕ: ffmpegи imagemagickможет потребоваться скомпилировать с некоторыми конкретными библиотеками (например, libass и fontconfig соответственно).

ccpizza
источник
Не обрабатывает клипы продолжительностью
oligofren
19.04: еще один обязательный пакет gifsicle, но затем возникает другая проблема: github.com/vvo/gifify/issues/95 Кроме того, не могли бы вы сообщить нам новичкам npm, в каком каталоге запускать npm installи нужно ли запускать его как root или нет? Спасибо!
Николас Рауль