ENDERU
GitHub22 repositoriesDaily Tech3 subscribersaudion.devthe product shelfRSSrelease feed
← All notesProjects

Решения

English · О программе · Руководство · Консольная команда

Содержание

Почему программа устроена так, как устроена.

Одна программа, нейросетевая часть — по машине

Программа одна. Три пресета на vs-mlrt — DPIR, Real-ESRGAN 2x, пересборка мягкого HD 2x — показываются и запускаются по тому, что есть у машины, а не по сборке: видеокарта NVIDIA RTX (её называет nvidia-smi) открывает установку MLRT, а установленный MLRT их запускает. Без карты и без MLRT их в окне нет: пресет, который здесь никогда не запустится, был бы только обещанием. MLRT, поставленный на машине с RTX, работает и после переноса папки: TensorRT, DirectML или процессор пресет выбирает сам.

MLRT ставится под эту карту (ресурсы TensorRT её архитектуры, модели, которые берут пресеты), а его закачка — около 3,5 ГБ — не остаётся в папке, когда проверка сред прошла.

Интерполяции кадров нет

RIFE — сеть, которая строит кадры между кадрами (из 24 в 48 или 60 в секунду), — в программу не входит: ни один доступный ей путь сегодня не даёт сразу верных кадров и терпимой скорости.

  • TensorRT — единственный быстрый путь vs-mlrt на видеокарте NVIDIA — на RTX 5070 (архитектура Blackwell, как у всех

RTX 50) строит неверные промежуточные кадры: каша вместо картинки при TensorRT 10.16, TensorRT 11.1 и TensorRT-RTX 1.5, в fp16 и в fp32, и в голом вызове vsmlrt.RIFE без пресета. Кадры источника проходят целыми: ошибка в том, что TensorRT собирает из этой сети под эту архитектуру, а не в скрипте. Карт прежних поколений (RTX 20–40) для проверки не было.

  • DirectML через ONNX Runtime даёт верные кадры, но плагин ONNX Runtime у vs-mlrt (vsort) собран только под старый

интерфейс плагинов, API 3, а его VapourSynth R80+ не загружает. Сборки под новый интерфейс несут TensorRT, TensorRT-RTX, OpenVINO и NCNN.

  • NCNN на Vulkan на этой сети падает («Unsupported split axis», нарушение доступа).
  • OpenVINO на процессоре даёт верные кадры, но медленно: на Ryzen 9 5900X (12 ядер) новый кадр 4K считается 1,28 с,

кадр 1080p — 0,30 с. Минута 24p, удвоенная до 48p, — это 1440 новых кадров: около 31 минуты в 4K и 7 минут в 1080p. Из 24 в 60 — 2880 новых кадров, не меньше часа на минуту 4K.

Дробный множитель (из 24 в 60 — это 2,5) vs-mlrt к тому же считает через плагин akarin, а он есть только под API 3. RIFE вернётся, когда на видеокарте появится путь с верными кадрами: TensorRT, исправленный под Blackwell, или ONNX Runtime, собранный под новый интерфейс плагинов.

Окно — лицо консольной команды

Каждая кнопка запускает операцию vs_cli.cmd, и первая строка каждого прогона в журнале — эта команда. Что форма позволяет — какой кодер даёт карточка, какой вариант выключен и почему, — решается один раз, в движке, и для окна, и для консоли. Поэтому пакетный файл, ИИ-агент и человек у окна получают один и тот же результат, а окно не может ничего, чего не может команда.

Решает картинка

Пресет выбирают глазами, поэтому его кадр стоит под его формой. Превью берёт кадр из середины видео — начало ролика часто чёрное или с титром — и считает его тем же скриптом с теми же значениями, что прогон, консольной командой, а не отдельным приближением. Оно считается, когда форму на мгновение оставили в покое, а не на каждое движение ползунка, и расчёт, который новое изменение сделало ненужным, сразу гасится: тяжёлый пресет на кадре 4K идёт секунды, и человеку незачем ждать кадров, на которые никто не смотрит.

Самый новый VapourSynth, плагины его интерфейса

VapourSynth R80 убрал старый интерфейс плагинов (API 3), а каталог многие плагины до сих пор даёт только в нём. Остаться на старом VapourSynth — заморозить программу на версии, которую больше не чинят, поэтому программа ставит самый новый стабильный VapourSynth и набор плагинов под его интерфейс (install\vs_plugins.json): из PyPI, из выпусков авторов на GitHub и из vsrepo. Набор не сдвигает ядро. Загружает ли ядро каждый плагин, читается из журнала загрузки самого ядра: отказ в плагине для Python молчит. Движок можно убрать в Корзину и поставить снова.

BM3D на любой видеокарте

BM3D идёт через Vulkan (bm3dvk): карта NVIDIA, AMD или Intel с обычным драйвером, без CUDA Toolkit. Без устройства Vulkan — на процессоре. На процессоре два прогона дают одни и те же кадры байт в байт; на видеокарте они сходятся около 65 дБ — она суммирует в разном порядке. Блок ОБРАБОТКА называет одно из двух.

Шумодавы меряют шум

Шумодав, настроенный на один уровень шума, размывает чистый материал или оставляет сильный шум. Семь шумодавов измеряют шум исходника до начала: на ровных участках пяти кадров по ролику, яркость и цвет каждый свой. Их настройки сделаны под шум около 2 кодов; больше — настройки растут (сигма BM3D и пороги MVTools — вместе с шумом, сигма DFTTest — с его квадратом), меньше — не опускаются, так что чистый материал получает ровно настройки. Порог смены сцены MVTools тоже растёт с шумом: на сильном шуме каждый блок превышает умолчание, и весь ролик прошёл бы новыми сценами, без фильтра. noise=fixed берёт настройки как есть.

Уровни сохраняются

Пресет не меняет диапазон исходника. Выход несёт в кадрах диапазон исходника; пресет, который идёт через RGB, возвращается в тот же диапазон; FFmpeg получает диапазон и на входе, и на выходе — только на выходе он счёл бы вход без метки ограниченным и растянул бы уровни.

Один файл — одни и те же кадры

У зерна постоянное начальное число, поэтому расчёт образа можно сравнить с другим его расчётом, а кадр превью — это тот кадр, который даст прогон.

Ничего рядом с файлом человека

Индексы исходников (.lwi, .ffindex) пишутся в папку программы, а не рядом с исходником: загрузчики по умолчанию кладут их возле файла, в папку человека. Движок, плагины, MLRT, кэши установщиков тоже живут в программе; в Windows, реестр и PATH ничего не попадает.

Файл либо целый, либо его нет

Результат пишется под своим именем и получает настоящее, только когда дописан; СТОП гасит vspipe и FFmpeg и убирает недописанный файл. Готовый результат пропускается, а не пишется заново, поэтому остановленный прогон по папке просто запускают снова, и он идёт с того места, где встал; «Перезаписать» делает всё заново.

Папка берётся целиком

Источник — файл или папка со всеми видео её подпапок, и результат сохраняет эти папки под папкой палитры и пресета с кодером. Папка результатов называет, как они сделаны; два пресета никогда не пишут в одну папку.

Неверное значение — неверный вызов

Число вне диапазона или вариант, которого у поля нет, получает отказ с причиной, а не подвигается молча к ближайшему допустимому: прогон не с теми значениями, что просили, хуже, чем никакого.

Обратный телесин отказывает медленному источнику

TIVTC убирает кадры, которые добавил телесин 3:2. На источнике меньше 29 к/с их нет, и он выбросил бы каждый пятый настоящий кадр; пресет отказывает такому источнику.

FFmpeg под драйвер

Сборка FFmpeg выбирается под драйвер NVIDIA: сборка новее, чем держит драйвер, ломает аппаратное кодирование, а не ускоряет его. Серия драйверов 610 окрепла, и 610.88 — её LTS: с ним и без видеокарты NVIDIA ставится самая новая стабильная FFmpeg — не старше 9.0.2, сборки, с которой проверены программы; более новая, не прошедшая пробу NVENC, возвращается к 9.0.2. Ниже 610.88 прежняя ветка сохраняет работу NVENC, и программа говорит, что доступны не все операции.

ОБРАБОТКА — где она что-то двигает

Блок ОБРАБОТКА стоит только у пресетов, где он что-то меняет: у пресетов с BM3D и у нейросетевых. Остальные фильтры всегда идут на процессоре, а выбор, который ничего не делает, читался бы как выбор, который важен.

Лестница качества

У каждого кодера одни и те же три ступени — 14, 17, 21, — и у программных, и у аппаратных: различимые шаги без перекрытия, от почти без потерь до черновика.

Звук

Обрабатывается только картинка. Звук копируется; ProRes, идущий в x264 или x265, получает AAC 384 кбит/с, потому что его PCM не ложится в эти контейнеры; MXF получает PCM 24 бит 48 кГц — другого звука его упаковщик не пишет. Аппаратного декодирования в программе нет: загрузчики VapourSynth декодируют на процессоре, что бы их ни просили.

Edited 10.20.2026