Программа SEZE II
Если вам интересна 2D графика и видео фильтры, то предлагаю вам ознакомиться с SEZE, программой применяющей пользовательские фильтры к видео, которые можно написать самому на C++.
Как вообще можно сделать видео фильтр?
Существуют программы, для которых можно написать свой видео плагин и он будет что-нибудь делать с кадрами видео. Это похоже на плагины 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 написана на С++ и использует 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-го и компилятор часто ругается что функции устарели, поэтому используйте именно это руководство.
- Паблик в ВК — тут будет инфа о новых эффектах.
Автор статьи является разработчиком программы, поэтому вы можете спросить что-то по коду или предложить улучшения в комментариях к публикации. На самом деле это копия статьи с Хабра, но с небольшими изменениями. На Хабре же на статью было 0 реакции, что странно, ведь моя предыдущая статья вызвала интерес в первый же день публикации и было много комментариев. Думаю, что на DTF народ заинтересованнее. Может хабровчане испугались черепушек с превьюхи?