diff --git a/BACKLOG.md b/BACKLOG.md index 7852fea..24a38ff 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -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]` в цепочке. Переключателей, которые стоят машинного времени, становится больше, а живут они кто где: прилипание и схлопывание — кнопками внизу, ключ в