- PVSM.RU - https://www.pvsm.ru -
Есть задача: Изменить видео “на лету” при воспроизведении — поменять местами правую и левую часть. Не отразить, а именно поменять, т.е. разрезать картинку на две части и поменять их местами. Можно, конечно, сделать с помощью фреймсервера типа AviSynth'a [1], но это уже не совсем “на лету” — надо писать скрипт для каждого видео файла. Хочется сделать это быстро и без напрягов.
На фига? Чтобы сделать курс лекций по машинному обучению [2] от Яндекса более удобным для просмотра. Лектор указывает на пункты презентации вживую, и приходится постоянно перескакивать через весь экран взглядом, чтобы понять, о чём речь:

Используем инструмент шейдеров, доступный в Media Player Classic [3]. В стандартном комплекте есть несколько готовых шейдеров для правки изображения — “Emboss”, “Grayscale”, “16-235 to 0-255” и тому подобные. Нужного нам там нет, поэтому создаём новый шейдер (небольшая программа на языке HLSL [4]):
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 FilesMPC-HCShaders) под именем Shift.hlsl. Далее заходим в настройки Media Player Classic (Options/Playback/Shaders) и добавляем новый шейдер Shift в список Active pre-Resize shaders.
Данный способ обработки видео не нагружает CPU, так как вся работа производится силами графической карты, во всяком случае, если она реальная, а не эмулированная.
Это пиксельный шейдер, который должен выдать на выходе цвет точки в зависимости от координат, которые передаются через параметр tex. Переменная s0 содержит текстуру с текущим кадром видео.
Новая горизонтальная координата вычисляется как остаток деления по модулю 1 от суммы текущей координаты и сдвига swapLine. Таким образом мы сдвигаем точку вправо и переставляем её в левую часть, когда она выходит за габариты.
И наконец, команда tex2D(s0, tex) возвращает цвет точки с нужной координатой из исходного кадра.
Автор: Александр Соркин
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/rabota-s-video/303853
Ссылки в тексте:
[1] AviSynth'a: https://habr.com/search/?q=avisynth#h
[2] курс лекций по машинному обучению: https://yandexdataschool.ru/edu-process/courses/machine-learning
[3] Media Player Classic: https://mpc-hc.org/
[4] HLSL: https://en.wikipedia.org/wiki/hlsl
[5] «Создание шейдеров»: https://habr.com/post/333002/
[6] github.com/dinfinity/mpc-pixel-shaders: https://github.com/dinfinity/mpc-pixel-shaders
[7] Источник: https://habr.com/post/434856/?utm_source=habrahabr&utm_medium=rss&utm_campaign=434856
Нажмите здесь для печати.