BACKLOG: кадрирование в окне и два видео рядом — по замеру
Про кадрирование обычного клипа было написано, что цепочка фильтров для 2688x1512 слишком дорога. Это память о другом замере: на деле 330 к/с без фильтра против 214 с веткой, включаемой по времени, при нужных 60 — запас трёхкратный. Заодно записан путь дешевле: mpv умеет обрезать и увеличивать на выводе, силами видеокарты. Про два видео рядом заведён свой раздел: граф сборки проверен на настоящих файлах, и названы три вещи, которых не хватает. Главная — клипу негде записать, какое место в кадре он занимает: масштаб сейчас всегда равномерный, и полосу в половину кадра им не выразить.
This commit is contained in:
parent
d0ec869743
commit
2160c33790
1 changed files with 69 additions and 9 deletions
78
BACKLOG.md
78
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]` в цепочке.
|
||||
|
||||
Переключателей, которые стоят машинного времени, становится больше, а
|
||||
живут они кто где: прилипание и схлопывание — кнопками внизу, ключ в
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue