Як створити анімований GIF з відео MP4 за допомогою командного рядка?


119

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


Ви можете використовувати цей скрипт на Github, який використовує FFMPEG і генерує проміжну палітру кольорів для кращої якості зображення.
troyane

Відповіді:


127

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 Гб для програми.

    Переважно я гарантую, що команда не використовує необмежену пам’ять, як певні попередні спроби.

    500Mb змушує 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 x 1024 в нашому випадку.

  • -r 15: вибірка FPS.

    Наприклад, оригінальне відео було 30 кадрів в секунду, тобто -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 # 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#Animated_GIF байт 324. Отже, 100означає 1 FPS, 5означає 1 / 0.5 == 20FPS.

Навіть якщо ви зменшите висоту та частоту кадрів, вихідний GIF все-таки може бути більшим, ніж відео, оскільки "справжні" формати відео без формату GIF стискаються через кадри, тоді як GIF стискає лише окремі кадри.

Прямий:

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

працював, але майже не вбив мого комп'ютера через переповнення пам’яті, і створив вихідний вихід на 100 разів більший для мого вхідного файлу 2s 1 Мб Можливо, одного дня ImageMagick наздожене.

Дивіться також: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

Тестовано на Ubuntu 17.10.


1
Скажіть, будь ласка, поясніть ;-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1
Ваша затримка не відповідає вашому значенню -r (отриманий gif - 2 рази швидкість). Також ви додали аргумент масштабу без видимих ​​причин (це робить gif дійсно невеликим).
asmeurer

2
Я згоден. Гіфки невеликого розміру краще для Інтернету. Дякую за scale=320:-1
зомбі

2
Для тих, хто цікавиться: видалення -r 10поверне GIF до нормальної швидкості.
Мітч

2
Я отримав gif на 20% більше, ніж mp4: O
Адам Голдман

113

Два кроки:

  • Витяг зображень із відео

    Створіть каталог з назвою фрейми в одному каталозі з вашим .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 за параметрами, які ви можете додати до команди другого кроку, щоб отримати менший файл.


1
чудова відповідь - додаткова інформація: ffmpeg можна встановити, використовуючи тут
chepyle

3
Майте на увазі, що framesпапка повинна існувати, щоб перша команда працювала.
totymedli

3
Для тих, хто бажає швидкого способу оптимізації, який, як правило, працює і занадто лінивий, щоб прочитати посилання, просто додайте -layers Optimizeдо останньої convertкоманди раніше *.jpg. Перевірте вихід, хоча це може вплинути. Для мене це зменшило розмір gif з 5 МБ до 700 КБ без помітних втрат якості :)
cpury

Дякуючи, що це був цікавий процес, mp4 розміром 5,6 МБ потрапив у gif розміром 236 Мб, не впевнений, що я його розміщую на своєму веб-сайті;) Можливо, 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!'

To Для завершення конверсії може знадобитися кілька хвилин навіть із меншими відео.

Примітка: ffmpegі , imagemagickможливо , повинні бути скомпільовані з деякими специфічними бібліотеками (тобто libass і FontConfig відповідно).


Не обробляти прибл> 40 сек кліпів: github.com/vvo/gifify/issues/99
oligofren

19.04: Ще один необхідний пакунок є gifsicle, але потім виникає інша проблема: github.com/vvo/gifify/isissue/95 Також ви б не хотіли сказати нам, що npm-новачків у тому каталозі для запуску npm installта запускати його як root чи ні? Дякую!
Ніколя Рауль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.