Video-spectrumizer финал





Ровно год назад я рассказывал, про свои попытки ускорить процесс конвертирования видео «под спектрум» — Video-spectrumizer с чего всё начиналось и к чему пришло. И тогда моё решение было таким: просто завалить железом небыстрый процесс покадровой конвертации. Т.е. был написан оркестратор, который управлял процессами: разборки видео на кадры, ресайзом, отправки кадра в конвертер, сборки кадров и кодирование с увеличением. Работал в несколько потоков и позволял на быстром железе хоть как-то (на самом деле весьма существенно) увеличить скорость обработки. Для коротких видео этого было вполне достаточно, но всё равно скорости не радовали, а когда требовалось обработать десятки тысяч и сотни тысяч кадров, то процесс мог растянуться на несколько часов.

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

Первым делом нужно было выяснить что конкретно нам мешает увеличить скорость обработки до предельного максимума. Первое что приходит в голову — это скорее всего тормозят все операции ввода\вывода с файлами. Это понятно, создать-прочитать-записать десятки тысяч файлов много-много раз — дело не быстрое и утомительное для hdd, а для ssd и вовсе опасное и смертельное, если много, часто и большими объемами. Решение напросилось сразу — делаем виртуальный диск в памяти и замеряем скорость. С переносом хранения рабочих файлов на рамдиск эффективность улучшилась, но не то чтобы сильно заметно на больших объёмах. Нужно искать пути оптимизации дальше.

Как я уже говорил в прошлый раз, я связывался с автором конвертера img2spec и рассказывал про свою боль с батч конвертированием, а именно с ужасающей просадкой скорости при обработке через cli img2spec большого количества файлов. Наверняка, именно при вызове конвертера и происходит расходование бесценного процессорного времени. Надо идти в исходники и разбираться. Однако, если я 10 лет назад осилил скрипты и работу с ffmpeg в cli, а потом со скрипом перенёс свои наработки в python и в конце концов помучав Go в итоге получил оркестратор этого всего добра — Video-spectrumizer, то углубиться в исходники на Си img2spec у меня сил уже не хватило… и что же, бросать на пол пути этот долгоиграющий проект?

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

Немного пообщавшись с агентом (в моём случае это был DeepSeek Flash) мои предположения подтвердились — даже при вызове конвертирования из cli img2spec полностью инициализировал GUI и подгружал SDL2 для каждого вызова, что катастрофически снижало эффективность в пересчёте на кадр.

Сразу же возникло несколько идей:
  • а возможно ли при вызове img2spec в cli не инициализировать GUI?
  • а что если все функции оркестратора запихать внутрь img2spec?
  • а можно ли передавать кадры из img2spec в ffmpeg без сохранения на диск?

Получив весьма развёрнутые объяснения от нейросетевого помощника, что это вполне осуществимо я принялся расписывать план действий и пробовать вайбкодить вообще в неизвестной мне области, коим является исходный Си код img2spec.

Первым делом я решил избавиться от инициализации GUI, чтобы проверить гипотезу, что много времени теряется на ненужные в данный момент действия. После того как нейронка переписала код я был весьма удивлён, что код собрался и конвертер работал. А что самое замечательное, при вызове img2spec в cli моим оркестратором Video-spectrumizer скорость реально возросла на больших количествах обрабатываемых файлов. Это был успех, я даже подумал: «а не оставить ли как есть? оно же УЖЕ стало быстрее!». Но всё-таки решил идти до победного и проверить справится LLM c дальнейшими планами по внедрению оркестратора прямиком в конвертер.

Расписывать построение планов и сам процесс взаимодействия с ИИ-агентом я не буду, хотя было довольно познавательно, но скажу, что получилось всё очень недурно и практически так, как и задумывалось. Через несколько итераций переписывания (а пришлось переписывать для тестирования также и Video-spectrumizer) получился новый img2spec_video. Сразу оговорюсь, что вся работа с видео всё ещё выполняется через ffmpeg\ffprobe, так что это нужно учитывать — ffmpeg должен быть доступен в системе.



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

Ну, а что там по скорости?
А по скорости всё прекрасно. Избавившись от всех файловых операций по сохранению и чтению кадров, удалось еще примерно в 2 раза увеличить скорость обработки + кадры теперь передаются из конвертера в ffmpeg напрямую. Отпала необходимость в многопоточном режиме, теперь обработка в одном потоке на максимальной скорости. Упираемся только в скорость конвертирования и кодирование\ресайз видеокодеком. Благодаря этому освободились ресурсы для других задач. Раньше, если оркестратор обрабатывал и сохранял кадры в несколько потоков и забирал все ресурсы системы при этом, то сейчас всё обрабатывается в одном потоке при существенном освобождении ресурсов для других задач. Грубо говоря, раньше если работал спектрумизер на 8-12-24 потоков, то мой компьютер, мягко говоря, просто ничего не мог больше делать, все ресурсы были заняты. Теперь сплошная благодать: кадры обрабатываются и видео кодируется, да еще и ресурсы в системе остаются для чего-то ещё.

Время работы через оркестратор:



Время работы нового img2spec_video:




На одном и том же файле с одинаковым выходным разрешением\кодеком\качеством:
  • Video spectrumizer — ≈47-48 минут обработки
  • img2spec_video — 19 минут 22 секунды

Длительность видео: 4 минуты 37 секунд
Размер входного видео: 3840x2160 60 к\с
Размер выходного видео: 2048x1536 60 к\с

Что получили: прогресс по скорости обработки в два раза и несомненное удобство подбора параметров конвертирования, выбирая кадры прямо на таймлайне видео.

Итог:
Смог бы я это всё сделать сам без LLM — это вряд ли…

Дошли бы руки у автора img2spec допилить конвертер по моим запросам — точно нет.

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

Может быть, какая-нибудь монструозная LLM типа Claude Fable 5, по цене крыла самолёта за токен смогла бы с полпинка с нуля написать такой конвертер c поддержкой видео и еще чего-нибудь, но это что-то на богатом. Без сомнения я был в большом удивлении, что DeepSeek Flash осилил по моим запросам сделать возможным новую функциональность в программе и умудриться ничего не поломать из того что было, а еще и немного улучшить.

Попробовать конвертер можно самому, скачав по ссылке новый img2spec_video. И не забудьте прописать в path ffmpeg. Сборку я тестировал только под Windows(10).

Скорее всего это еще не финал, там много чего ещё можно улучшить, ну, например, сделать некие ключевые метки по таймлайну, где конвертер запоминал бы настройки обработки и в процессе конвертирования их подменял. Так можно будет побороть главную проблему — слишком тёмных и слишком светлых участков т.к. динамический диапазон конвертированного изображения намного ниже исходного. Можно добавить возможность проигрывания видео с текущими настройками и прочее.

Но сейчас я оставляю как есть, думаю, можно поставить точку над многолетними экспериментами :)



Будущее как будто бы незаметно наступает. Вкалывают роботы, счастлив человек.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.