BACKLOG: кадрирование в окне и два видео рядом — по замеру

Про кадрирование обычного клипа было написано, что цепочка фильтров для
2688x1512 слишком дорога. Это память о другом замере: на деле 330 к/с
без фильтра против 214 с веткой, включаемой по времени, при нужных 60 —
запас трёхкратный. Заодно записан путь дешевле: mpv умеет обрезать и
увеличивать на выводе, силами видеокарты.

Про два видео рядом заведён свой раздел: граф сборки проверен на
настоящих файлах, и названы три вещи, которых не хватает. Главная —
клипу негде записать, какое место в кадре он занимает: масштаб сейчас
всегда равномерный, и полосу в половину кадра им не выразить.
This commit is contained in:
4aiman 2026-09-30 22:00:49 +03:00
commit 2160c33790

View file

@ -87,17 +87,77 @@ MP4/H.264 нельзя — контейнер и кодек альфу не хр
Проверено опытом: у клипа выключен только ключ, кадрирование оставлено —
окно показывает его во весь кадр.
Как это делается тем же механизмом, что и наложение: провести такой клип
через ту же дорожку наложения, а под ним заставить основу быть чёрной —
непрозрачный клип с полями в готовом ролике именно так и закрывает всё,
что ниже. Значит, уплощению нужно понятие «здесь дыра, даже если ниже
что-то есть».
Почему нельзя просто добавить фильтр. Цепочка у mpv одна на весь список
кусков, а кадрирование задаётся каждому клипу своё. Включить фильтр на
одном куске и выключить на следующем нечем: из фильтров ffmpeg по времени
переключаются только те, у кого есть поддержка временной шкалы, а у
`crop` и `scale` её нет — есть только у `overlay`. Значит время включения
выражается единственным способом: раздвоить поток, одну ветку обрезать и
растянуть, и наложить её на другую с `enable='between(t,...)'`. Ветка при
этом работает на каждом кадре фильма, а не только там, где клип виден.
Чего это стоит: ветка масштабирования в цепочке работает на каждом кадре,
а не только там, где клип виден. Для накладки в 512 точек это пустяк, для
куска 2688x1512 — уже нет. Поэтому сначала замер, потом решение.
Замер (DJI 2688x1512, HEVC 55 Мбит/с, 600 кадров, `--vo=null`):
## Окно настроек программы
| | время | кадров в секунду |
|---|---|---|
| без фильтра | 1.82 с | 330 |
| ветка «обрезать и растянуть» с `enable` | 2.81 с | 214 |
Нужно 60, то есть запас трёхкратный: путь через цепочку по деньгам
проходит. Раньше здесь было написано, что для 2688x1512 это уже не
пустяк, — написано по памяти о замере вписывания, а не об этом случае.
Но есть путь дешевле. mpv умеет обрезать и увеличивать на выводе, силами
видеокарты: свойства `video-crop`, `video-zoom`, `video-pan-x/y`,
`video-rotate` есть в нашей версии 0.37. Они действуют на всё окно сразу,
но плеером управляем мы и знаем, где курсор: зашли в клип с кадрированием
— выставили, вышли — сняли. Ни цепочки, ни копирования кадров из памяти
видеокарты в обычную. Ограничения: одно преобразование на всё окно, так
что при одновременном наложении всё равно нужна цепочка; отражения таким
свойством не задать; переключение на границе клипа придёт с запозданием в
кадр-другой.
## Два видео рядом в одном кадре
Два ролика 16:9, каждый обрезан до половины кадра: один слева до
середины, другой от середины вправо. Никакого смешивания, просто два
куска рядом.
Сборке для этого не нужно ничего нового — только числа. Проверено на
настоящих файлах, кадр получается с первого раза:
[0:v]crop=1344:1512:672:0,pad=2688:1512:0:0,setsar=1[l];
[1:v]crop=1344:1512:672:0,setsar=1[r];
[l][r]overlay=1344:0[out]
То есть каждому источнику своя обрезка, затем оба кладутся на свои места.
Именно такой граф и строит `ArgsRenderLayers`: у слоя уже есть и своя
цепочка фильтров, и координаты, куда его положить.
Не хватает трёх вещей, и первая — главная.
**Клипу негде записать, какое место в кадре он занимает.** Преобразование
сейчас описывает только, как источник ложится в кадр целиком: вписать,
заполнить с обрезкой, увеличение, смещение, поворот. Масштаб при этом
всегда равномерный, поэтому из кадра 2688x1512 никакими настройками не
получить полосу 1344x1512 — для неё нужно сжать вдвое по ширине и не
трогать высоту. Нужен прямоугольник назначения: четыре числа в долях
кадра проекта. Тогда всё остальное — вписывание, увеличение, смещение —
начинает работать внутри него, а `BuildTransform` меняется только в
аргументах: размер прямоугольника вместо размера кадра, а возвращаемые
координаты сдвигаются на его начало.
**Уплощение считает непрозрачный клип закрывающим всё.** Нижний клип
подхватывается, только когда верхний полупрозрачный или с ключом. Значит
половинка на верхней дорожке сегодня закроет собой нижнее видео чёрными
полями. Условие должно смотреть на прямоугольник назначения: не накрывает
кадр — значит под ним видно то, что ниже.
**Предпросмотру нужна вторая дорожка наложения.** Сейчас плеер добавляет
одну: основа — список кусков, поверх неё одна внешняя дорожка. Для двух
половинок обе должны идти через цепочку над чёрной основой, то есть
внешних дорожек нужно две. Механика та же самая — ещё один `video-add` и
ещё один вход `[vidN]` в цепочке.
Переключателей, которые стоят машинного времени, становится больше, а
живут они кто где: прилипание и схлопывание — кнопками внизу, ключ в