Главная » Хабрахабр » [Из песочницы] Редактирование видео в MPC с помощью шейдеров

[Из песочницы] Редактирование видео в MPC с помощью шейдеров

Есть задача: Изменить видео “на лету” при воспроизведении — поменять местами правую и левую часть. Не отразить, а именно поменять, т.е. разрезать картинку на две части и поменять их местами. Можно, конечно, сделать с помощью фреймсервера типа AviSynth'a, но это уже не совсем “на лету” — надо писать скрипт для каждого видео файла. Хочется сделать это быстро и без напрягов.

Лектор указывает на пункты презентации вживую, и приходится постоянно перескакивать через весь экран взглядом, чтобы понять, о чём речь: На фига? Чтобы сделать курс лекций по машинному обучению от Яндекса более удобным для просмотра.

image

Решение

Используем инструмент шейдеров, доступный в Media Player Classic. В стандартном комплекте есть несколько готовых шейдеров для правки изображения — “Emboss”, “Grayscale”, “16-235 to 0-255” и тому подобные. Нужного нам там нет, поэтому создаём новый шейдер (небольшая программа на языке HLSL):

sampler s0 : register(s0); float4 main(float2 tex : TEXCOORD0) : COLOR
{ // swapLine 0.5 = in the middle float swapLine = 1082.0 / 1920.0; tex.x = (tex.x + swapLine) % 1.0; float4 c0 = tex2D(s0, tex); return c0;
}

Сохраняем его в папку \Shaders медиаплеера (например, C:\Program Files\MPC-HC\Shaders) под именем Shift.hlsl. Далее заходим в настройки Media Player Classic (Options/Playback/Shaders) и добавляем новый шейдер Shift в список Active pre-Resize shaders.

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

Что это, Бэримор?

Это пиксельный шейдер, который должен выдать на выходе цвет точки в зависимости от координат, которые передаются через параметр tex. Переменная s0 содержит текстуру с текущим кадром видео.

Таким образом мы сдвигаем точку вправо и переставляем её в левую часть, когда она выходит за габариты. Новая горизонтальная координата вычисляется как остаток деления по модулю 1 от суммы текущей координаты и сдвига swapLine.

И наконец, команда tex2D(s0, tex) возвращает цвет точки с нужной координатой из исходного кадра.

P.S.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Крупнейший дамп в истории: 2,7 млрд аккаунтов, из них 773 млн уникальных

Каждый может проверить там свой email на предмет утечки. Известный специалист по безопасности Трой Хант уже несколько лет поддерживает сайт Have I Been Pwned (HIBP) с миллионами записей об украденных аккаунтов. Но он никогда не видел, чтобы на продажу выставляли ...

Подборка @pythonetc, декабрь 2018

Это седьмая подборка советов про Python и программирование из моего авторского канала @pythonetc. Предыдущие подборки: Множественные контексты Иногда бывает нужно запустить какой-то блок кода в нескольких менеджерах контекста: with open('f') as f: with open('g') as g: with open('h') as h: ...