Как создать анимированный GIF из видео MP4 через командную строку?
Я хочу сделать анимированный .gif
из .mp4
видео. Я бы предпочел сделать это из командной строки, поэтому, пожалуйста, перечисляйте только инструменты командной строки.
5 ответов
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 и составляет 1024 x 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-in-a-video-on-the-linux-command-line/1044894Я рекомендую эту опцию, потому что видео форматы обычно имеют более высокую частоту кадров из-за большего разрешения. С меньшими GIF-изображениями более низкая частота кадров менее заметна, поэтому мы можем пропускать некоторые кадры и создавать меньшие GIF-изображения.
До 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-extensioneog
,firefox
и хром по умолчанию работает бесконечно, даже без него, поэтому я не уверен, насколько это необходимо.-delay 5
: время ожидания перед отображением следующего кадра, с точностью до секунды, как описано на https://en.wikipedia.org/wiki/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.
Два шага:
Извлечь изображения из видео
Создайте каталог с именем 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 для параметров, которые вы можете добавить к команде второго шага, чтобы получить файл меньшего размера.
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 соответственно).
Полное раскрытие: это мой проект.
Если вы используете Linux, вы можете использовать linux-mpv-gif-generator
Вам понадобятся ffmpeg, kdialog и mpv.
sudo apt install ffmpeg kdialog mpv
Вы должны разместить
mpv-gif.lua
в
$HOME/.config/mpv/scripts
Теперь, когда вы запускаете видео в mpv, вы сможете использовать gдля установки начального кадра, Gдля установки конечного кадра, Ctrl+gдля создания gif. Когда вы нажмете Ctrl+g, он спросит, где вы хотите сохранить GIF.
Я начал собирать инструмент, чтобы обеспечить упрощенный интерфейс для общих действий.
Вы можете преобразовать MP4 в GIF следующим образом:
$ npm install @mountbuild/mouse -g
$ mouse convert input.mp4 -o output.gif -s 00:00:00 -e 00:00:03
Вы можете изменить время начала и окончания, а
--fps
и
--width
также.
Для этого необходимо установить ffmpeg.
Если ничего другого нет, проверьте исходный код и посмотрите, как написать свой собственный сценарий для этого на JavaScript.