Руководство по конвертации видео в GIF с помощью FFmpeg
Руководство по конвертации видео в GIF с помощью FFmpeg

фон

При написании технической документации часто необходимо для удобства изложения вставлять несколько коротких видеоресурсов. Например, какие-то видеоролики с операциями, какие-то классические видеоклипы, какие-то научно-популярные анимации и т. д. Поскольку местом отображения обычно является веб-страница, и если вставляются такие ресурсы, как видео, то обычно требуется дополнительное хранилище и поддержка доступного видеоплеера, что очень неудобно. Для воспроизведения операций командной строки мы можем использовать Asciinema,Однако это решение не может моделировать нетерминальные операции. Распространенным решением является преобразование необходимых ресурсов в веб-страницы. GIF、WEBP Формат и другие анимации. Учитывая, что основные браузеры GIF поддержка формата является наиболее стабильной, поэтому в большинстве случаев мы хотим преобразовать короткое видео для отображения в GIF формат для удобной вставки непосредственно в документ.

Конвертировать видео в GIF И чтобы GIF В процессе настройки будет много подводных камней, таких как серьезная разница в цвете, неподходящее разрешение, GIF. Такие проблемы, как чрезмерное использование памяти. Иногда перед преобразованием мы также хотим выполнить некоторую обрезку и т. д. На самом деле существует множество инструментов для обработки изображений, таких как ImageMagick из convert инструмент, или gifsicle Инструменты и даже некоторая проволока существуют из Преобразование формата Инструмент GIF (крайне не рекомендуется),сложно использовать). Но когда существуют процессы видеоподобной информации,Эти инструменты на самом деле не очень подходят. Ведь исходные данные сами по себе являются видео,По сравнению с первым преобразованием видео в GIF Затем проделайте операцию, завершите операцию прямо на видео и, наконец, преобразуйте в GIF причинаиз Меньше информации будет потеряно,Эффект будет лучше。Эта статья в основном основана на FFmpeg Кратко опишите команды прибытия, которые часто используются в процессе преобразования, и представьте некоторые принципы решения этих проблем.

Предварительная обработка видео

В типичном сценарии существования перед съемкой мы обычно делаем следующие шаги:

  • Коллекция видео
  • Обрезка видео
  • Регулировка разрешения видео
  • Регулировка частоты кадров видео
  • Регулировка скорости видео
  • сжатие видео

Ниже будет дано краткое введение, основанное на этом процессе и примерах. Локальный из ffmpeg Версия 4.4.1.

Коллекция видео

Если мы сможем получить видеофайл о прибытии,лучше всего. Однако во многих случаях нам все равно необходимо использовать некоторые инструменты записи экрана для захвата,Однако, будучи пациентом с системной мизофобией,Лично я не рекомендую скачивать какие-то грязные исходники.из Экран записиинструмент Или это может быть очень дорого, но обычные люди вообще не смогут им воспользоваться.приезжать Сколько функцийизобработка программное обеспечение для видео.

  • существовать Windows Вниз,Можетпроходить Win+G Горячая клавиша для вызова xbox Принесите свой собственныйиз Экран записиинструмент。
  • существовать Mac Вниз,Можетпроходить Command+Shift+5 Горячая клавиша для вызова。

Вышеперечисленных инструментов вполне достаточно.

Обрезка видео

Будь то ваше собственное видео,Или записать экран, чтобы сделать видео?,Нам часто хочется отрезать какие-то бесполезные фрагменты в начале и конце. Конечно, мы можем использовать обычные инструменты редактирования.,Например Mac начальствоиз imovie ждать. Но, очевидно, мы не хотим убивать курицу ножом, одна или две команды могут решить проблему.

перехвачено из 00:00:10 Начинать  10 Секунды из периода времени из видео:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -ss 00:00:10 -t 00:00:10 output1.mov

(в -ss Указывает время начала, -t Указывает на перехватизпродолжительность)

перехвачено из 00:00:10 приезжать 00:00:20 период времениизвидео:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -ss 00:00:10 -to 00:00:20 output2.mov

(в -ss Указывает время начала, -to указывает время окончания)

Убедитесь, что они одинаковы, и подтвердите продолжительность видео:

Язык кода:javascript
копировать
$ diff output1.mov output2.mov
$ ffprobe -v error -show_entries format=duration sample.mov
[FORMAT]
duration=10.000000
[/FORMAT]

(в -v error Это необходимо для блокировки первоначальной печати информации о версии)

Регулировка разрешения видео

Поскольку видео, которое нам нужно отобразить, встроено в документ или веб-страницу, само разрешение изображения не очень требовательно. В настоящее время соответствующее уменьшение разрешения полезно как для размера файла, так и для удобства отображения. Используемый инструмент — ffmpeg из графика фильтра масштаба.

Подтвердите исходное разрешение видео:

Язык кода:javascript
копировать
$ ffprobe -v error -show_entries stream=width,height sample.mov
[STREAM]
width=1560
height=1148
[/STREAM]

Принудительное пропорциональное масштабирование, установка длины и ширины:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -vf scale=720:530 output1.mov

(в 720 — ширина, 530 — высота, причем ни ширина, ни высота не могут быть нечетными числами)

Масштабирование с фиксированным соотношением, заданная ширина, адаптивная высота:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -vf scale=720:-1 output2.mov

Масштабирование с фиксированным соотношением, заданная высота, адаптивная ширина:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -vf scale=-1:530 output3.mov

(Изменить адаптивную часть настройки на -1,Если адаптивная часть снова масштабируется,но Можетнастраиватьдля -2 ,-3 ждать)

Выберите собственный алгоритм масштабирования, дополнительный алгоритм виден.ScalerOptions

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -vf scale=-1:530:flags=lanczos  output4.mov

(Существует множество алгоритмов масштабирования. Если эффект неудовлетворительный, можно попробовать разные. По умолчанию используется бикубический алгоритм)

Регулировка частоты кадров видео

Частота кадров видео обычно относительно высока, и мы GIF Требования, как правило, не такие высокие. Чтобы уменьшить размер изображения, мы можем вручную настроить частоту кадров, чтобы добиться наилучшего баланса между размером изображения и удобством пользователя. Обычно частота кадров видео обычно 60 fps . Для обычных фотографий 20 кадров в секунду уже достаточно, приберегите несколько слов, 10 fps ,5 fps Это нормально смотреть, но мне придется испытать это на себе.

Подтвердите исходную частоту кадров видео:

Язык кода:javascript
копировать
$ ffprobe -v error -show_entries stream=r_frame_rate sample.mov
[STREAM]
r_frame_rate=60/1
[/STREAM]

(Частота кадров исходного видео — 60 кадров в секунду)

Настройте частоту кадров до 20:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -r 20 output1.mov

Регулировка скорости видео

Для записи экрана,Может быть, мы двигаемся медленно,Я надеюсь, что существующие позволят немного ускорить отображение, повысить эффективность отображения и уменьшить размер видео. Или само видео очень быстрое,Мы хотим сыграть медленную игру. В таких случаях нам лучше заранее что-то сделать со скоростью видео.

Настройте скорость видео в 5 раз быстрее (длительность * 0,2):

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -filter:v "setpts=0.2*PTS" output1.mov

Отрегулируйте скорость видео в 2 раза медленнее (продолжительность x 2):

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -filter:v "setpts=2*PTS" output2.mov

(принциппроходить Корректированиевидеорамкасерединаиз PTS Отображение временной метки для регулировки скорости)

Следует отметить, что из,Корректированиеставканазад,Частота кадров остается прежней. Поэтому после ускорения, а затем замедления видео до исходной скорости видео,,Информация будет потеряна по сравнению с исходным видео.

сжатие видео

Фактически, само видео H264 имеет очень высокую скорость видеоконтента.,Если вы хотите пойти дальше,В принципе может толькопроходитьнекоторые с потерямиизформа。нас Можетпроходить Корректирование x264, x265, а также libvpx серединаиз Constant Rate Factor параметры для выполнения некоторыхповреждающийиметь дело с。Этот параметрценитьсуществовать 0 приезжать 51 Среди них, чем больше значение, тем больше коэффициент потерь и тем лучше скорость сжатия. Обычно мы берем Значение 23 можно скорректировать до 30+, если оно более радикальное.

Корректирование crf ценитьприезжать30 :

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -crf 30 output1.mov

Сравните размеры двух:

Язык кода:javascript
копировать
$ ls -lah sample.mov output1.mov
-rw-r--r--  1 myths  staff   1.5M May  1 17:31 sample.mov
-rw-r--r--@ 1 myths  staff   1.0M May  1 17:51 output1.mov

Видно, что на видео действительно какое-то сжатие.,Однако вы обнаружите, что качество GIF будет несколько снижено. Обязателен ли параметр Корректирование?,Делать выбор необходимо исходя из реальной ситуации.

Преобразование формата GIF

По умолчанию ffmpeg поддерживает автоматическую обработку преобразования на основе суффикса имени выходного файла. формата,Очень удобно. Но если вы думаете, что можете использовать это, не думая,Это не могло быть более неправильным.

Проблема с частотой кадров

Типичный метод преобразования ошибок:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov output.gif

В чем проблема? Давайте проверим продолжительность видео, чтобы узнать:

Язык кода:javascript
копировать
$ ffprobe -v error -show_entries format=duration sample.mov
[FORMAT]
duration=62.000000
[/FORMAT]

$ ffprobe -v error -show_entries format=duration output.gif
[FORMAT]
duration=173.680000
[/FORMAT]

Мы обнаружили, что после преобразования из GIF Длина видео на самом деле отличается от оригинального видео. После открытия теста выяснилось, что правильный GIF Это намного медленнее, чем оригинальное видео.

Повторная проверка частоты кадров выявила проблему:

Язык кода:javascript
копировать
$ ffprobe -v error -show_entries stream=r_frame_rate,avg_frame_rate sample.mov
[STREAM]
r_frame_rate=60/1
avg_frame_rate=60/1
[/STREAM]

$ ffprobe -v error -show_entries stream=r_frame_rate,avg_frame_rate output.gif
[STREAM]
r_frame_rate=50/1
avg_frame_rate=257/12
[/STREAM]

Фактическая частота кадров GIF из фактически стала меньше, неудивительно, что видео стало длиннее. Рассчитать коэффициент также можно:

173.680000/62.000000≈(60/1)/(257/12)

В этом случае мы можем принудительно установить частоту кадров:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -r 20 output2.gif

$ ffprobe -v error -show_entries stream=r_frame_rate,avg_frame_rate,duration output2.gif
[STREAM]
r_frame_rate=20/1
avg_frame_rate=20/1
duration=62.050000
[/STREAM]

Таким образом, продолжительность соответствует исходному видео.,Частота кадров также является нашей настройкой частоты кадров. Конкретная причина неизвестна,Но вывод таковПри конвертации видео в GIF обязательно переукажите частоту кадров.

Оптимизация палитры

ты можешь знать,Видео другое,Цветовая палитра PNGиз содержит всего 256 цветов. По умолчанию,Эти 256 цветов будут распределены максимально равномерно по всему цветовому пространству. В результате некоторые изображения получаются с относительно небольшой цветовой дискриминацией.,Может произойти размытие цвета.

首先нас生成一张ВнизНе оптимизированоВнизизкартина:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -r 20 output-raw.gif

Результат следующий:

В это время вам нужно использовать правильноекартина Проведите Внизобщая ситуация Оптимизация палитры

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output-palette.gif

Результат следующий:

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

конечно,Если у вас высокие требования к качеству изображения,также МожетЗапись палитры индивидуально для каждого кадра(Ценакартинастанет намного больше):

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen=stats_mode=single [p];[s1][p]paletteuse=new=1" output-palette-single.gif

Если картина имеет относительно большую степень движения,также Может Изменить некоторыеПараметры защиты от сотрясений( dither = none / bayer / heckbert / floyd_steinberg / sierra2 / sierra2_4a), если не указано, по умолчанию используется sierra2_4a . Например:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse=dither=none" output-palette-none.gif

$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse=dither=bayer" output-palette-bayer.gif

$ ffmpeg -i sample.mov -r 20 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse=dither=heckbert" output-palette-heckbert.gif

Наконец, взгляните на размер изображения после добавления Оптимизации палитры:

Язык кода:javascript
копировать
$ ls -lah
-rw-r--r--   1 myths  staff   2.2M May  2 11:36 output-palette-bayer.gif
-rw-r--r--   1 myths  staff   2.5M May  2 11:36 output-palette-heckbert.gif
-rw-r--r--   1 myths  staff   1.9M May  2 11:40 output-palette-none.gif
-rw-r--r--   1 myths  staff    32M May  2 11:29 output-palette-single.gif
-rw-r--r--@  1 myths  staff   2.7M May  2 11:15 output-palette.gif
-rw-r--r--   1 myths  staff   1.0M May  2 11:30 output-raw.gif
-rw-r--r--@  1 myths  staff   198K May  1 22:15 sample.mov

Очевидно, что палитра записывается каждый кадр ( output-palette-single.gif ) Максимум не проводите Оптимизацию; у палитры самая маленькая картинка, но худшее качество( output-raw.gif ); без использования стратегии защиты от встряхивания (); output-palette-none.gif ) Это уменьшит изображение и не повлияет на его внешний вид.

Настройка количества циклов GIF

проходить ffmpeg Вы также можете настраивать изображения с учетом времени цикла. После завершения воспроизведения изображения оно начнет воспроизводиться снова по умолчанию. Если вы хотите изменить эту функцию, вы можете продолжить. -loop Параметр указывает метод цикла или указывает -final_delay Интервал настройки параметров:

Чтобы запретить запуск GIF после воспроизведения:

Язык кода:javascript
копировать
$ ffmpeg -i sample.mov -r 20 -loop -1 output.gif

gif muxer Поддерживать -loop и -final_delay Описание параметра можно посмотреть командой проводить:

Язык кода:javascript
копировать
$ ffmpeg -v error -h muxer=gif
Muxer gif [CompuServe Graphics Interchange Format (GIF)]:
    Common extensions: gif.
    Mime type: image/gif.
    Default video codec: gif.
GIF muxer AVOptions:
  -loop              <int>        E.......... Number of times to loop the output: -1 - no loop, 0 - infinite loop (from -1 to 65535) (default 0)
  -final_delay       <int>        E.......... Force delay (in centiseconds) after the last frame (from -1 to 65535) (default -1)

Это немного сбивает с толку,В дополнение к бесконечному повторению (0) и отсутствию повторения (-1) и значению з,если хочешь повторить N раз, то это -loop Параметры должны быть установлены на N+1 。。。

Анализ размера изображения

Наконец, последовательно запишите изменения размера одного из моих тестовых ресурсов после описанной выше обработки:

  1. Исходное видео после записи: 9,3М. (формат mov)
  2. Видео после перекодирования без каких-либо параметров: 1,5М (формат mov)
  3. После обрезки по мере необходимости: 1,2 м. (формат mov)
  4. Резолюцию дает 1560x1148 Корректированиедля 720x539 назад:541K(формат mov)
  5. частота кадров от 60 Корректированиедля 20 После: 339 тыс. (формат mov)
  6. ставка x2 После: 235 тыс. (формат mov)
  7. сжатие видео CRF ценить 30 После: 198 тыс. (формат mov)
  8. Преобразовать в GIF , после использования глобальной палитры и отмены настроек антитряски: 1,9M (гиф-формат)

GIF Эффект сжатия формата все еще намного хуже, чем у обычного видеоформата, но существующие попытки обеспечить качество изображения основаны на контроле размера изображения. 2M В целом это еще приемлемо.

Ссылки

метод сжатия gif изображения (командная строка)

Speeding up/slowing down video

CRF Guide

How do I convert a video to GIF using ffmpeg, with reasonable quality?

High quality GIF with FFmpeg

Я хочу создавать красивые GIF-файлы с помощью ffmpeg.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose