Предпросмотр показывает кадрирование клипа

Клип со своим кадрированием играл в окне во весь кадр: цепочка фильтров
у mpv одна на весь список кусков, а включить её на одном куске и
выключить на следующем нечем — из фильтров ffmpeg по времени
переключается только наложение.

Обошлось без цепочки вовсе. У вывода mpv своя обрезка, и делает её
видеокарта: курсор зашёл в клип с кадрированием — выставили, вышел —
сняли. Ни перестройки цепочки, ни копирования кадров из памяти
видеокарты в обычную.

Рамку источника считает теперь один код на две стороны: по ней окно
«Кадрирование и поворот» рисует рамку, и её же плеер отдаёт как обрезку.
Проверка в tests/lfmcheck сверяет рамку с фильтром сборки: увеличение
2.77 даёт 970x546 посередине, и это ровно то, что вырезает
crop=2688:1512:2379:1338 после scale=7446:4188.

Проверено глазами на невидимом экране, на настоящем материале с дрона:
картинка в окне совпала с готовым роликом, на границе с обычным клипом
обрезка снимается и возвращается. Сверено со сборкой из прошлого
коммита — там на том же месте кадр без кадрирования.

Не покрыто и записано в BACKLOG: отражение (свойства для него нет),
растяжение и участки с наложением — там кадр уже сведён цепочкой.
This commit is contained in:
4aiman 2026-10-01 00:04:57 +03:00
commit 235cd00e9a
8 changed files with 329 additions and 70 deletions

View file

@ -76,46 +76,35 @@ ffmpeg проблемой не является: он запускается о
MP4/H.264 нельзя — контейнер и кодек альфу не хранят. Для этого нужен
отдельный вывод в VP9 или ProRes 4444.
## Предпросмотр не показывает кадрирование обычного клипа
## Предпросмотр: чего он про кадрирование всё ещё не показывает
Кадрирование и поворот видны в окне только у клипов с ключом или
прозрачностью: их плеер кладёт поверх основы сам и применяет к ним
цепочку фильтров. Обычный клип идёт списком кусков, а список фильтровать
нечем — он играется как есть, во весь кадр. В готовом ролике при этом всё
верно: такой кусок помечен на пересборку и обкладывается полями.
Кадрирование обычного клипа окно теперь показывает — обрезкой на выводе
плеера, её делает видеокарта даром. Остались три случая, где оно
по-прежнему играется как есть, и для них точную картинку даёт окно
«Кадрирование и поворот»:
Проверено опытом: у клипа выключен только ключ, кадрирование оставлено —
окно показывает его во весь кадр.
**Отражение.** У вывода mpv нет свойства для отражения, только для
поворота. Понадобится — придётся вести такой клип через цепочку.
Почему нельзя просто добавить фильтр. Цепочка у mpv одна на весь список
кусков, а кадрирование задаётся каждому клипу своё. Включить фильтр на
одном куске и выключить на следующем нечем: из фильтров ffmpeg по времени
переключаются только те, у кого есть поддержка временной шкалы, а у
`crop` и `scale` её нет — есть только у `overlay`. Значит время включения
выражается единственным способом: раздвоить поток, одну ветку обрезать и
растянуть, и наложить её на другую с `enable='between(t,...)'`. Ветка при
этом работает на каждом кадре фильма, а не только там, где клип виден.
**Растяжение.** Кадр жмётся неравномерно, рамкой это не описать.
Замер (DJI 2688x1512, HEVC 55 Мбит/с, 600 кадров, `--vo=null`):
**Участок с наложением.** Там кадр уже сведён цепочкой, и обрезка на
выводе резала бы сведённое целиком, вместе с нижним слоем. Такой клип
нужно вести через ту же цепочку, что и само наложение.
Цена пути через цепочку известна, мерили (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. Они действуют на всё окно сразу,
но плеером управляем мы и знаем, где курсор: зашли в клип с кадрированием
— выставили, вышли — сняли. Ни цепочки, ни копирования кадров из памяти
видеокарты в обычную. Ограничения: одно преобразование на всё окно, так
что при одновременном наложении всё равно нужна цепочка; отражения таким
свойством не задать; переключение на границе клипа придёт с запозданием в
кадр-другой.
Нужно 60, то есть запас трёхкратный: по деньгам проходит. Устроена она
так: раздвоить поток, одну ветку обрезать и растянуть, и наложить её на
другую с `enable='between(t,...)'`. Иначе никак — из фильтров ffmpeg по
времени переключается только `overlay`, у `crop` и `scale` поддержки
временной шкалы нет.
## Два видео рядом в одном кадре