О чём статья

Мне нравятся разные 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 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 color noise.bat
tvsim color noise.bat
tvsim bw ringing.bat
tvsim bw ringing.bat
colorop rnd.bat
colorop rnd.bat
YUVA classic.bat
YUVA classic.bat
lineswap.bat
lineswap.bat
pixelsort h.bat
pixelsort h.bat
stars lights diagonal.bat
stars lights diagonal.bat
rdither.bat
rdither.bat

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-го и компилятор часто ругается что функции устарели, поэтому используйте именно это руководство.

  • Паблик в ВК - тут будет инфа о новых эффектах.

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

Комментарии (0)