Создайте анимированный gif из видео mp4 через командную строку

54

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

    
задан Maythux 15.07.2015 в 10:01
источник

3 ответа

62

Два шага:

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

    Создайте каталог с фреймами в том же каталоге с файлом .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 15.07.2015 в 10:01
44

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

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

быстро и с разумным размером производили вывод, чем у входного файла.

Источник: Ссылка

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

  • -r 10 : выборка FPS. Например, если исходное видео имеет 30 FPS, -r 10 означает, что ffmpeg будет выбирать один кадр в каждом 3. Входной FPS можно найти с ffprobe , а общее количество входных кадров можно найти с помощью mediainfo , как описано в: Ссылка Относительно низкое значение, например 10 , будет означать меньшее количество выходных кадров и, следовательно, меньшие GIF. TODO some

  • -loop 0 : добавьте поле вывода цикла Netscape Gif к выходу. 0 означает бесконечный цикл, как описано в: Ссылка eog , firefox и хром все цикл бесконечно по умолчанию, даже без него, поэтому я не уверен, насколько это необходимо.

  • -delay 5 : время ожидания перед показом следующего кадра в hundreths второго, как описано в: Ссылка byte 324. Таким образом, 100 означает 1 FPS, 5 означает 1 / 0.5 == 20FPS .

Дополнительные необязательные аргументы, которые вы, скорее всего, захотите:

  • ffmpeg -vf scale=320:-1 : вывести выход 320 пикселей по высоте. Это распространенный вариант использования GIF для Интернета. Если вы удалите эту опцию, выходной GIF будет иметь ту же высоту, что и входное видео. Исходную высоту можно найти, например, с помощью ffprobe : Ссылка и вывод с identify .

  • ffmpeg -ss 00:02:26 -to 00:02:36 : конвертировать видео только с 02 минут 26 секунд до 02 минут 36 секунд. См. Также: Ссылка

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

Прямое:

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

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

Протестировано на Ubuntu 17.10.

    
ответ дан Ciro Santilli 包子露宪 六四事件 法轮功 15.10.2016 в 20:56
4

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!'

❗️ Для завершения конвертации может потребоваться несколько минут даже при меньших видео.

  

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

    
ответ дан ccpizza 03.09.2017 в 21:44