Модные видео гличи на C++

Мне нравятся разные 2D эффекты типа дизеринга или pixel sort и я написал несколько плагинов для Paint Dot Net, но они были только для статичных изображений, а мне захотелось сделать то же самое, только для видео и сейчас я опишу какие были подводные.

Как вообще можно сделать видео фильтр?

Существуют программы, для которых можно написать свой видео плагин и он будет что-нибудь делать с кадрами видео. Это похоже на плагины LADSPA, которые обрабатывают аудио сигналы в Audacity или плагины к Фотошопу. Вот некоторые из этих программ:

  • GStreamer - этот фреймворк может использоваться другими приложениями для манипуляциями над видео, но он так же может самостоятельно открывать файлы и конвертировать их через программу gst-launch-1.0. Для GStreamer можно написать видео плагин пользуясь этой документацией. Мне показалось что юзерам будет сложно скачать 150 мб программы и завести всё это, поэтому я отказался от создания плагинов для GStreamer.
  • FFmpeg - эта программа способна конвертировать видео любого формата. Вы конечно можете написать весь видео фильтр через -filter_complex, но FFmpeg поддерживает frei0r плагины, которые можно написать на C++. Я же захотел немножечко свой велосипед, поэтому мне это не подошло.
  • OBS Studio - для этой программы тоже можно написать фильтр. Его так же надо писать на сях и компилировать как и в случае с первыми вариантами. Видео фильтр будет применяться для всех кадров получаемых при записи через OBS.
  • VirtualDub - даже на Хабре есть статья как писать плагин к этой программе. Но VirtualDub доступен только для Windows.
  • AviSynth - тоже поддерживает возможность создания плагинов, но работает только в Windows.
  • Shotcut - открытый видео редактор, почти весь работает на сторонних видео и аудио фильтрах. Ну а как там писать плагины - гайды есть. Даже frei0r поддерживается. К сожалению у меня в Линуксе Шоткат не видит некоторые фильтры и разрабы мне не помогли советом перекинуть фильтры с билда на Юбунту к себе в Арч. На Винде-то всё работает ;-/
  • Kega Fusion - это эмулятор игр для Сеги. Его автор Stive Snake расщедрился на создание графических плагинов к которым ещё и прикрепил исходники (см. раздел с плагинами). Хоть это и эмулятор, но его эффекты очень интересны и я, зная как работает API плагинов, пытался воссоздать декодер плагинов, но не вышло. Я не понял как там кадры устроены, слишком длинный pitch у битмапа, если вы в этом разбираетесь, то помогите мне и я добавлю декодер этих плагинов себе в SEZE.
  • MPV - универсальный видео плеер позволяющий накладывать на видео пиксельные шейдеры и даже конвертировать всё в файл.

Теоретически, даже в VLC плеере можно сделать фильтр на вывод, но как вы поняли, ни одни из этих вариантов я не выбрал и сделал свой православный конвертер с эффектами и выложил на Гитхабе.

SEZE II

Программа имеет такое название, потому что я допустил ошибку в слове size и ничего больше не придумал как назвать программу именно так. Кстати, оказалось что в китайском языке слово seze обозначает цвет, что символично, учитывая назначение программы. II это римская цифра 2, потому что это моя вторая попытка сделать эту прогу, теперь она с интерфейсом и более юзер-френдли.

Упрощённая схема работы SEZE II

Программа SEZE написана на С++ и использует FFmpeg API для работы с видео. Кадры из видео преобразуются в нужный создателю плагина формат и раздаются потокам процессора для обработки. Затем, прошедшие через фильтр кадры выводятся на экран посредством SDL2 и записываются в выходное видео в высоком качестве (libx264rgb, crf 0, RGB24, без звука).

Сама по себе программа консольная и чтобы узнать все её команды, запустите seze в консоли без параметров или с -h ключом. Так же есть простая GUI версия, но она не имеет всех опций CLI версии. Для применения эффекта требуется файл фильтра, который является .dll или.so файлом и подключается при запуске программы. В репозитории проекта есть API к плагинам в виде одного хедера, его можно использовать для создания собственного плагина. Автор плагина сам решает какие опции будет получать плагин, в каком формат будут изображения из видео и какие оптимизации применять при компиляции. Как сделать плагин, можно узнать здесь. Для обладателей Windows доступны Drag'N'Drop-батники, на которые можно перетащить ярлык с видео файлом и обработка сразу начнётся без ручного выставления настроек.

Коллекция плагинов

Зацените видео с демонстрацией эффектов, так же в нём есть инструкция по установке и запуску программы:

Демонстраци

В папке plugins есть реализации моих видео фильтров, они оптимизированы для Pentium II MMX на Windows x32 и для SSE2 на Linux x64. Если вам интересно, то вы можете написать собственный фильтр и отправить его мне, исходники не обязательны. Я добавлю ваш эффект в следующий релиз. Так же вы можете скинуть и исходники, тогда они пойдут в репозиторий и я напишу вас как автора в ридми.

Ну а сейчас я буду издеваться над картинкой Лены:

  • TVsim - эффект имитирует работу аналогового телевизора. Доступны стандартные разрешения, ЧБ цвет и NTSC формат. AM-модуляцию не вышло добавить. Имитируется ТВ сигнал с гасящими импульсами, пустыми строками, уровнями напряжения и на это всё накладывается шум, из-за чего получаются правдоподобные помехи. Так же есть затухание кинескопа, интерлейсинг и эффект Гиббса (Ringing artifact).
  • Colorop - этим эффектом можно применять математические операции к цветовым компонентам, например к красному оттенку применить операцию XOR со случайным.числом.
  • YUVA - это мой очень старый видео эффект. Он не в папке свободных плагинов, потому что его код настолько убогий и медленный, что его лучше не видеть никому.
  • Lineswap - строки случайным образом копируются вверх или вниз несколько раз.
  • Pixelsort - популярный эффект, пиксели сортируются по яркости или другим признакам в пределах интервалов. Пока что выглядит не так шикарно как на картинках в интернете.
  • Rdither - дизеринг со случайным узором, использует 3-битную палитру из 8-и цветов.
  • Stars - рисует звёздочки с 8-ю лучами, которые появляются на самых ярких пикселях.

Почти у каждого эффекта есть собственные команды для настроек, которые можно увидеть в консоли при их запуске. Команды передаются через ключ --opts "всё что в кавычках уже будет относиться к командам для плагина".

Примечания

Почему файлы большие? - они в lossless качестве, поэтому большие. Используйте параметр запуска --noraw и тогда видео будет сжато получше, но качество будет хуже.

Как скомпилировать? - используется система сборки SCons, так что вам понадобится интерпретатор питона и сама система сборки. Её можно скачать через pip. Другие подробности смотрите здесь.

Звук - на выходе в видео нет звука, это потому что звуковой поток игнорируется и я с ним никогда не работал, поэтому не добавил его поддержку.

Почему хэши не совпадают? - однажды меня спросили почему libstdc++ имеет не тот размер что в официальном релизе и нет ли там вирусов. Вирусов нигде нет, все программы и библиотеки урезаны с помощью утилиты strip и пожаты с помощью UPX с опцией --ultra-brute. Если вы не доверяете моим билдам, то можете лично собрать всё из исходников.

Это лучше чем альтернативы? - конечно нет, я эту программу только вчера выложил, но думаю что лёгкий вес и многопоточность являются её преимуществом. FFmpeg сам по себе быстро работает, а собрано всё с оптимизациями на C++. Оптимизировать остаётся только сами алгоритмы эффектов.

Ссылки

  • Репозиторий SEZE II на Гитхабе - MIT лицуха. Можете скопировать себе реп и делать что угодно. Предлагайте свои улучшения и рассказывайте друзьям прогерам.
  • Современный гайд по FFmpeg API - модерн-уроки. Примеры кода в FFmpeg года аж 2001-го и компилятор часто ругается что функции устарели, поэтому используйте именно это руководство.
  • Паблик в ВК - тут будет инфа о новых эффектах.

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

22
Начать дискуссию