AviSynth+

AviSynth+ позволяет собирать обработку видео и звука в AVS-скрипте: открыть источник подходящим source-фильтром, вырезать и склеить диапазоны, кадрировать и масштабировать кадр, преобразовать цвет и разрядность, обработать аудио, наложить текст и передать готовый поток в плеер или кодировщик без промежуточного рендера.

Работа строится вокруг клипов и функций: исходник становится объектом clip, а каждая следующая операция возвращает изменённый поток кадров и, если он присутствует, звука. За счёт переменных можно держать несколько ветвей одного материала, сравнивать результаты и собирать финальную последовательность без промежуточных файлов.

Главное условие стабильного скрипта — явно контролировать источник, формат пикселей, частоту кадров, свойства аудио, разрядность процесса и требования внешних плагинов. AviSynth+ охотно связывает разные инструменты в одну цепочку, но не скрывает несовместимости: большинство ошибок решаются проверкой свойств непосредственно перед проблемным фильтром.

Скачать AviSynth+

Оценка 9.7Рекомендуем
  • Конвертация видео
  • Сжатие файлов
  • Просто для новичков
Скачать бесплатно на Windows
Лучшая альтернатива
AviSynth+
Оценка 8.5
  • Нет собственного GUI
  • Нужны AVS-скрипты
  • Кодирует внешний хост
Скачать AviSynth+
Загрузка начнётся после нажатия

Как работает AviSynth+

AviSynth+ строит результат как граф фильтров. AVS-файл не хранит перекодированное видео: он описывает, откуда взять кадры и звук и какие операции выполнить над ними. Когда совместимый плеер, редактор или кодировщик запрашивает очередной кадр, движок проходит нужную часть графа и возвращает вычисленный результат. Поэтому правка одной строки скрипта меняет всю дальнейшую обработку без создания нового промежуточного файла. Такой подход особенно удобен для воспроизводимых цепочек, где одни и те же операции нужно применять к серии материалов.

В скрипте каждый фильтр получает clip и возвращает новый clip либо создаёт clip как source-фильтр. В простых цепочках можно использовать неявную переменную last: source-фильтр создаёт исходный клип, следующая строка обрабатывает его, а результат становится входом для следующей операции. В сложных сценариях безопаснее присваивать промежуточным клипам имена. Тогда можно сохранить исходную ветвь, получить две версии с разными параметрами, сравнить их через StackHorizontal или Interleave и лишь после этого выбрать окончательный вариант.

Поскольку движок отдаёт кадры по запросу, привычного проекта с дорожками, клипами и кнопкой рендера здесь нет. Монтажная логика выражается функциями Trim, AlignedSplice, UnalignedSplice, Dissolve, DeleteFrame, DuplicateFrame, FreezeFrame и родственными фильтрами. Это не ограничивает точность: границы можно задавать номерами кадров, а для звука использовать AudioTrim и функции, работающие со временем или количеством сэмплов. Ограничение другое — пользователь сам отвечает за последовательность операций и совместимость свойств клипов.

Перед большой цепочкой полезно определить четыре вещи: каким source-фильтром открывается материал, какой формат пикселей выдаёт источник, нужны ли точные покадровые обращения и какой процесс будет потреблять итоговый AVS. Ошибка на любом из этих уровней позже выглядит как проблема фильтра, хотя причина может быть в декодере, разрядности DLL или несовместимом формате. Поэтому диагностику удобнее вести снизу вверх: сначала источник, затем геометрия и таймлайн, после них цвет и звук, потом внешние плагины и многопоточность.

Схема: Как устроена цепочка обработки

Создание и проверка AVS-скрипта

AVS — обычный текстовый файл с выражениями языка AviSynth. Для минимальной проверки можно использовать source-фильтр Version: он создаёт короткий диагностический клип и позволяет убедиться, что хост действительно загрузил AviSynth+. Затем в скрипт добавляют реальный источник и постепенно наращивают цепочку. Такой способ быстрее выявляет строку, после которой возникает ошибка, чем попытка сразу запустить десятки фильтров и разбираться с одним общим сообщением.

Синтаксис допускает позиционные и именованные параметры, переменные, пользовательские функции, условные выражения и runtime-функции. В пользовательском сценарии не нужно начинать с программирования: большинство бытовых цепочек состоит из последовательных вызовов фильтров. Именованные аргументы полезны там, где у функции много необязательных параметров: они делают смысл строки заметнее и снижают риск перепутать порядок значений. Комментарии тоже стоит использовать, особенно рядом с выбранной матрицей цвета, порядком полей и нестандартным MT-режимом.

Пути к файлам — частый источник сбоев. На Windows исторически часть строковых параметров могла интерпретироваться через системную кодовую страницу, а новые функции постепенно получают явную поддержку UTF-8. Если конкретный фильтр имеет параметр utf8, его следует задавать осознанно для пути с нелатинскими символами. Ещё надёжнее во время диагностики временно перенести тестовый материал в короткий каталог с простым именем: если ошибка исчезла, проблема связана не с кадрами, а с обработкой пути конкретным фильтром или плагином.

При отладке полезно возвращать промежуточный клип раньше финальной строки. Например, если после источника всё открывается, после Crop тоже, а после внешнего denoise-фильтра возникает ошибка, область поиска уже сведена к одному плагину и его входным требованиям. Для контроля свойств существуют Info, ShowFrameNumber и другие debug-фильтры. Их лучше включать временно: служебный текст изменяет видимый кадр и не должен случайно попасть в финальное кодирование.

Импорт видео и выбор source-фильтра

Для AVI предусмотрены AVISource, OpenDMLSource и AVIFileSource. Они опираются на механизм Video for Windows и подходят, когда контейнер и установленный VfW-декодер образуют предсказуемую связку. Выбор source-фильтра важнее расширения файла: один и тот же контейнер AVI может содержать разные кодеки, поэтому успешное открытие зависит от доступного декодера и его разрядности. Если AVISource сообщает, что не может обработать поток, сначала проверяют кодек и архитектуру процесса, а не пытаются исправить проблему цветовым фильтром.

DirectShowSource использует Microsoft DirectShow и способен открыть многие форматы, которые воспроизводятся через установленную DirectShow-цепочку. У такого пути есть принципиальные оговорки. DirectShow-декодер не обязан обеспечивать точный seek по кадрам и не всегда корректно сообщает частоту кадров. Поэтому DirectShowSource удобен как совместимый запасной путь, но для задач с точной нарезкой длинного GOP-видео лучше предпочесть специализированный индексирующий source-плагин, если он доступен для нужного формата.

У DirectShowSource есть параметры fps, seek, audio, video, convertfps, pixel_type и диагностическое логирование. Принудительный fps не следует задавать только ради исчезновения ошибки: он меняет временную модель результата и должен соответствовать реальному материалу. Ограничение pixel_type полезно, если фильтры DirectShow предлагают неподходящий формат, однако сам Graph Builder может вставить преобразователь. Значит, итоговый формат всё равно нужно проверить в AviSynth, а не предполагать по настройке декодера.

Для современных контейнеров на практике часто применяют внешние source-плагины, например семейства FFMS2 или L-SMASH Works. Они не являются встроенной функцией AviSynth+, поэтому статья не приписывает движку нативное декодирование MKV, MP4, HEVC или AV1. AviSynth+ обрабатывает уже декодированные кадры, а фактическую поддержку кодека определяет source-плагин и его библиотеки. Это различие важно и для диагностики: обновление ядра не обязательно меняет набор доступных декодеров.

Если файл содержит несколько аудио- или видеопотоков, универсальный source-фильтр может выбрать не тот поток или вообще не дать удобного выбора. В таких случаях надёжнее демультиплексировать дорожки либо использовать source-плагин с явным выбором track. Затем видео и звук можно собрать через AudioDub. Такой подход делает скрипт прозрачнее: отдельно видно, какой источник создаёт кадры и какой — аудио.

Схема: Выбор источника

Импорт изображений и последовательностей кадров

ImageSource и ImageReader создают видеоклип из одного изображения или нумерованной последовательности. Для последовательности путь задаётся как шаблон с подстановкой номера кадра, а параметры start, end и fps определяют диапазон и скорость воспроизведения. Один файл можно повторять на протяжении заданного числа кадров, поэтому функция подходит для заставок, тестовых таблиц и статичных фонов. Поддерживаемые форматы зависят от встроенного пути и, для части типов, от DevIL.

При работе с последовательностью кадров принципиально важно согласовать fps с дальнейшим видео. Кадры не содержат универсального времени сами по себе: частота, указанная ImageSource, задаёт длительность каждого изображения. Если затем такую последовательность склеить с клипом другой частоты, AlignedSplice потребует совместимые свойства. Практичнее заранее привести частоту и размеры к целевым параметрам, а не исправлять несоответствие в последней строке.

ImageWriter решает обратную задачу — сохраняет кадры в изображения. Это полезно для контрольных кадров, последовательности для внешнего инструмента или поиска кадра с конкретным артефактом. Но ImageWriter не заменяет кодировщик контейнера: он пишет изображения, а не MP4 или MKV. Для финального видео AVS обычно передают внешнему кодировщику, который сам выбирает видеокодек, аудиокодек, контейнер и режим управления качеством.

Обрезка по времени и кадрам с Trim

Trim удаляет кадры с начала и конца клипа. Нумерация начинается с нуля, а параметр last_frame в обычной форме включителен: Trim(first, last) возвращает оба граничных кадра. После обрезки новый клип снова начинается с кадра 0. Это важная деталь при каскадных операциях: номера, рассчитанные относительно исходника, нельзя бездумно применять к уже укороченной версии.

Если скрипт собирает несколько фрагментов одного источника, проще хранить исходный clip в переменной и каждый Trim применять именно к нему. Тогда диапазоны остаются привязаны к исходной нумерации и читаются однозначно. Альтернатива — последовательные Trim над last — требует вручную пересчитывать границы после каждой операции и чаще приводит к ошибке на один кадр.

Для клипа со звуком Trim обрезает и видео, и соответствующее аудио. Для аудио без видеоряда предназначен AudioTrim. Он позволяет задавать границы в секундах или сэмплах в зависимости от формы вызова, что полезно для точной работы со звуковой дорожкой. Если нужно сохранить исходное видео и отдельно сдвинуть аудио, Trim применять к общему клипу не стоит: сначала разделяют или заново собирают компоненты через AudioDub.

Ошибку на границе легко заметить с ShowFrameNumber или Info. Перед финальным кодированием временно выводят номер кадра вокруг стыка и проверяют несколько кадров до и после. После проверки диагностический фильтр убирают. Такой контроль особенно полезен при рекламе, повреждённых участках и сценах, где соседние кадры похожи и визуальный просмотр на обычной скорости не показывает промах в одну позицию.

Схема: Монтаж по кадрам

Склейка фрагментов и переходы

AlignedSplice и UnalignedSplice соединяют клипы последовательно. Для большинства обычных случаев документация рекомендует AlignedSplice: при необходимости он корректирует начало второй звуковой дорожки тишиной или обрезкой так, чтобы синхронизация с видео сохранилась. UnalignedSplice просто конкатенирует звук и полезен для сегментов, которые изначально были непрерывной записью и должны сохранять точную последовательность аудиосэмплов.

Перед склейкой клипы должны совпадать по размеру кадра, формату цвета и частоте кадров; для звука также нужны одинаковые sample rate, разрядность и число каналов. Если один фрагмент RGB, другой YUV, а третий имеет иной fps, ошибка склейки — ожидаемое поведение. Правильное решение состоит не в случайных ConvertTo и AssumeFPS, а в осознанной нормализации всех ветвей к единому рабочему формату.

Операторы ++ и + являются краткими формами AlignedSplice и UnalignedSplice. В длинном скрипте явные имена функций обычно читаются лучше, особенно когда нужно объяснить выбор обработки звука. Короткая запись удобна для монтажной строки из нескольких Trim одного и того же источника. В любом варианте свойства первого клипа играют важную роль для результата, поэтому порядок аргументов нельзя считать полностью симметричным.

Dissolve создаёт перекрытие соседних клипов и постепенно смешивает кадры на заданном количестве позиций; при наличии звука аудиопотоки тоже смешиваются. Это базовый переход, а не полноценная система эффектов монтажа. Размеры и форматы входов должны быть совместимы, иначе переход не может корректно смешать пиксели. Если нужны сложные маски или анимированные композиции, используют Overlay, маски, ScriptClip либо внешние плагины.

Частота кадров и временная модель

AssumeFPS, ChangeFPS и ConvertFPS меняют частоту кадров разными способами, поэтому их нельзя считать взаимозаменяемыми. AssumeFPS меняет временную интерпретацию последовательности без создания промежуточных кадров; длительность видео при этом изменяется, а для клипа со звуком могут потребоваться дополнительные решения. ChangeFPS формирует новую последовательность за счёт выбора или повторения кадров. ConvertFPS предназначен для преобразования частоты с интерполяционной логикой, отличающейся от простого дублирования.

Если задача — исправить ошибочно заявленный fps источника, сначала нужно понять, неверны ли метаданные или действительно требуется преобразование движения. Подмена fps ради совпадения длительности может скрыть исходную проблему и создать рассинхрон звука. Для захваченного материала с известной постоянной частотой AssumeFPS бывает уместен, но для переменной частоты кадров вопрос сложнее: классическая модель AviSynth ориентирована на последовательность с заданным fps, поэтому VFR-материал обычно требует корректной подготовки или таймкодов на стороне внешнего инструмента.

DeleteFrame, DuplicateFrame, SelectEvery, SelectEven и SelectOdd меняют состав последовательности кадров и тем самым могут влиять на длительность и движение. После таких операций важно повторно проверить аудио. Например, удаление видеокадра само по себе не означает автоматического удаления соответствующего короткого участка аудио. Для монтажной задачи, где звук должен следовать за вырезанными сценами, безопаснее работать Trim на общем клипе и затем склеивать фрагменты.

Схема: Склейка фрагментов

Кадрирование без потери лишних пикселей

Crop удаляет области по краям каждого кадра. Можно указать left, top, width и height либо задать отрицательные right и bottom в альтернативной форме. Фильтр не масштабирует изображение: после него геометрический размер кадра реально уменьшается. Это принципиальное отличие от Letterbox и AddBorders, которые сохраняют или увеличивают холст за счёт заполнения границ.

Для субдискретизированных YUV-форматов координаты Crop могут иметь ограничения по кратности. Причина не в интерфейсе AviSynth, а в геометрии chroma-плоскостей: один chroma-сэмпл соответствует нескольким luma-пикселям. Если сместить границу на недопустимое число пикселей, фильтр не сможет сохранить исходную структуру без дополнительной конверсии. Поэтому перед Crop полезно знать текущий pixel format и не подбирать числа вслепую.

В resize-фильтрах есть возможность одновременно выбрать субпиксельную область источника через src_left, src_top, src_width и src_height. Такой путь нужен, когда граница должна проходить не по целому пикселю или когда кадрирование является частью одного ресемплинга. Для обычного удаления чёрных полей отдельный Crop проще читать и легче проверять. Главное — не применять два независимых кадрирования и не забывать, как они меняют дальнейшие координаты Overlay.

Масштабирование и выбор resizer

AviSynth+ содержит BilinearResize, BicubicResize, LanczosResize, Lanczos4Resize, BlackmanResize, GaussResize, SincResize, Spline16Resize, Spline36Resize, Spline64Resize, PointResize и другие варианты. Они решают одну задачу — изменяют размер кадра, но используют разные ядра и дают разный компромисс между резкостью, алиасингом и ringing. Универсального лучшего фильтра нет: выбор зависит от масштаба, характера изображения и того, важнее ли сохранить микроконтраст или подавить ореолы.

При сильном уменьшении изображения разумно проверять тонкие диагонали, текст, сетки и высокочастотные детали. Слишком резкое ядро может подчеркнуть ringing, а слишком мягкое — убрать полезную фактуру. AviSynth удобен тем, что можно создать две ветви с разными resizer, сложить их рядом и просмотреть одинаковые кадры. Такой A/B-контроль надёжнее правила вроде использовать всегда один конкретный kernel.

Если ширина или высота не меняется, реализация может пропустить соответствующий горизонтальный или вертикальный resizer. В современных версиях фильтры учитывают дополнительные параметры размещения chroma. Это ещё одна причина не копировать старые рецепты без понимания: результат зависит не только от нового размера, но и от формата пикселей, chroma placement и заданной области источника.

Масштабирование чересстрочного видео требует отдельной логики. Нельзя считать два поля одного кадра обычными соседними строками прогрессивного изображения и вертикально смешивать их произвольным resizer: это создаёт временные артефакты. Либо используют обработку с учётом полей, либо корректно деинтерлейсят до операций, которые смешивают строки. Порядок полей при этом должен быть известен и не угадываться по единичному кадру.

Схема: Кадрирование и масштаб

Цветовые форматы и преобразования

AviSynth+ поддерживает широкий набор packed и planar форматов RGB и YUV, включая высокую разрядность и 32-битный float в тех фильтрах, где это предусмотрено. Название контейнера не определяет внутренний pixel format: source-фильтр может выдать YV12, YUY2, planar RGB или другой формат в зависимости от декодера и параметров. Перед цепочкой, чувствительной к цвету, полезно явно проверить BitsPerComponent, IsRGB, IsYUV и родственные свойства, а затем привести материал к ожидаемому формату один раз.

ConvertToRGB, ConvertToYUV и более конкретные ConvertTo-операции выполняют не просто перестановку каналов. При переходе между RGB и YUV участвуют матрица, диапазон и subsampling chroma. Ошибочный выбор матрицы приводит к систематическому сдвигу яркости и цвета, а неверное толкование limited/full range — к прижатым теням, выбеленным уровням или незаконным значениям. Поэтому конверсию следует проектировать как часть цветового тракта, а не вставлять только потому, что очередной плагин потребовал другой формат.

Некоторые фильтры сохраняют frame properties, которые описывают цветовые характеристики, а часть старых плагинов ничего о них не знает. Наличие свойства само по себе не гарантирует, что каждый внешний фильтр корректно его обновит. После сложной цепочки, особенно с плагинами разных поколений, важно проверить реальный сигнал Histogram и тестовыми кадрами. Метаданные и пиксели должны согласовываться, иначе внешний кодировщик может интерпретировать результат иначе, чем ожидалось.

SwapUV, UToY, VToY, YToUV, MergeChroma и MergeLuma позволяют работать с компонентами отдельно. Это полезно для диагностики chroma-сдвига, масок и специальных реставрационных цепочек. Но такие функции легко разрушить цвет, если применять их без понимания плоскостей. В типичном конвертировании они не нужны: достаточно корректного source-фильтра и одного продуманного ConvertTo на границе с фильтром или кодировщиком.

Разрядность и ConvertBits

ConvertBits меняет разрядность, стараясь сохранить цветовой формат, если такая комбинация поддерживается. Допустимы 8, 10, 12, 14 и 16 бит для целочисленных представлений, а также 32-bit float. Переход вверх не восстанавливает детализацию, которой не было в исходнике: он лишь создаёт рабочее представление с большей точностью для последующих вычислений. Польза высокой разрядности проявляется внутри цепочки, где несколько преобразований цвета, ресайзов и фильтров могли бы накапливать округление.

При уменьшении разрядности ConvertBits умеет добавлять ordered dither или error-diffusion dither. Дизеринг не увеличивает реальную точность, но распределяет ошибку квантования и способен уменьшить заметную полосатость на плавных градиентах. Его стоит применять в конце высокобитной цепочки, когда известно целевое представление кодировщика. Если после ConvertBits снова идут операции, меняющие уровни, порядок следует пересмотреть: ранний dither может быть частично разрушен дальнейшей обработкой.

Параметры fulls и fulld предназначены для явного преобразования диапазона. Их нельзя использовать как универсальную кнопку исправления тёмного или блеклого изображения. Сначала определяется, какой диапазон фактически имеет источник и как он помечен, затем выбирается целевой диапазон. Если сигнал уже full range, повторное расширение меняет уровни неправильно; если limited ошибочно трактуется как full, проблема тоже не исчезает сама.

В цепочке с внешними плагинами нужно проверять поддерживаемую bit depth каждого звена. Старый DLL-фильтр может принимать только 8-bit YV12, тогда как источник выдаёт 10-bit planar YUV. В этом случае есть выбор: найти современный плагин с high-bit-depth поддержкой либо осознанно понизить разрядность перед ним. Скрытая автоконверсия хуже явной, потому что труднее понять, где именно произошла потеря точности.

Схема: Цвет и разрядность

Histogram и контроль сигнала

Histogram — диагностический фильтр, который помогает видеть распределение яркости и цветовых компонентов. Режим levels удобен для проверки того, не выходят ли значения за ожидаемый диапазон и не обрезаны ли тени или света. Такой контроль особенно важен после ColorYUV, Levels, Tweak и преобразований RGB↔YUV. Оценка только по монитору ненадёжна: плеер, видеодрайвер и дисплей могут дополнительно преобразовывать диапазон.

ColorYUV предоставляет регулировки YUV-компонентов и режимы анализа. Levels позволяет перераспределять входные уровни в выходной диапазон, а Tweak изменяет яркость, контрастность, оттенок и насыщенность в своей модели. Эти фильтры подходят для точных коррекций, но не являются полноценной системой color grading с узлами, трекингом и LUT-браузером. В AviSynth обычно строят повторяемую математическую коррекцию, где параметры известны заранее или вычисляются скриптом.

Для проверки двух вариантов полезно сохранить исходную ветвь и создать обработанную. StackHorizontal или StackVertical размещают их рядом, а Interleave чередует кадры. Subtract показывает разность между клипами и помогает обнаружить неожиданное изменение там, где обработка должна была быть нейтральной. Эти операции особенно полезны при замене одного resizer другим, тестировании chroma placement и сравнении до/после денойза.

Базовые фильтры изображения

В ядре присутствуют простые Blur и Sharpen, GeneralConvolution, SpatialSoften и TemporalSoften. Они действительно меняют изображение, но не заменяют специализированные современные плагины реставрации. Blur и Sharpen используют сравнительно простую обработку и удобны для небольшой коррекции или теста. SpatialSoften и TemporalSoften исторически предназначены для подавления шума по пространственной и временной близости, однако для сложного материала обычно выбирают профильные внешние фильтры.

AddBorders добавляет поля вокруг кадра, Letterbox затемняет области по краям, FlipHorizontal и FlipVertical отражают изображение, TurnLeft, TurnRight и Turn180 поворачивают его. Эти операции не требуют монтажного интерфейса и хорошо подходят для автоматической нормализации серии файлов. Важно лишь соблюдать ограничения формата пикселей и итогового размера, особенно перед кодировщиком с требованиями к чётности ширины и высоты.

FadeIn и FadeOut создают линейное появление и затухание, а FreezeFrame заменяет диапазон кадров выбранным кадром. DeleteFrame и DuplicateFrame работают с отдельными позициями. Эти фильтры позволяют исправлять точечные монтажные дефекты, но их применение к видео со звуком нужно планировать отдельно: изменение числа видеокадров может нарушить временное соответствие аудио, если операция не меняет звуковую дорожку тем же способом.

SelectEvery выбирает кадры по циклической схеме, а SelectEven и SelectOdd являются удобными частными вариантами. Они полезны при анализе полей, телесина и тестовых последовательностей. Использовать SelectEven как универсальный метод деинтерлейса нельзя: удаление половины кадров или полей не создаёт недостающую временную информацию и может вдвое изменить временное разрешение.

Схема: Работа со звуком

Overlay, маски и композиция

Overlay помещает один клип поверх другого с координатами x и y, опциональной маской, непрозрачностью и режимом смешивания. Размер overlay-клипа не обязан совпадать с базовым, но маска должна соответствовать overlay по размеру. Это позволяет собирать водяные знаки, picture-in-picture, локальные коррекции и визуальные сравнения. Координаты относятся к текущему размеру базового кадра, поэтому Crop или Resize перед Overlay меняют систему отсчёта.

При некоторых режимах Overlay внутренне работает в 4:4:4, а затем возвращает результат к выходному формату. Для RGB часть режимов может обрабатываться без лишней конверсии. Это важно для качества: несколько последовательных Overlay на subsampled YUV способны многократно затрагивать chroma. Если композиция сложная, лучше заранее выбрать рабочий формат, выполнить наложения и только потом перейти к формату кодировщика.

Mask, MaskHS, ColorKeyMask и родственные функции создают или применяют маски. Маска определяет, где overlay видим и насколько. Limited/full диапазон маски имеет значение: если белый в маске не достигает ожидаемого максимума, полностью непрозрачная область может остаться частично прозрачной. Поэтому маску проверяют как обычный видеоклип, при необходимости приводят диапазон и только затем используют в Overlay.

Layer — более старый механизм смешивания, а Overlay обычно предоставляет более гибкие режимы и позиционирование. Выбор зависит от конкретного скрипта и совместимости. Если цель — простой логотип на постоянной позиции, сложная масочная цепочка не нужна. Если область должна меняться по кадрам, AviSynth позволяет строить conditional/runtime-логику, но такой сценарий требует внимательной проверки производительности.

Текст и субтитры

Subtitle накладывает антиалиасный текст на диапазон кадров и доступен на Windows. Можно задавать позицию, шрифт, размер, цвет, halo, интервал и угол. Важно понимать результат: текст становится частью видеокадра. AviSynth не создаёт отдельную переключаемую subtitle-дорожку контейнера; для мягких субтитров нужен внешний muxer или другой этап обработки.

Text — упрощённый кроссплатформенный вариант с bitmap-шрифтами и меньшим набором возможностей. Он полезен для диагностики, подписей в сравнительных кадрах и скриптов, которые должны одинаково работать вне Windows. Если нужен оформленный титр с конкретной типографикой, следует проверить, какой текстовый фильтр доступен на целевой системе и как хост обрабатывает Unicode.

ShowFrameNumber, ShowSMPTE, Info и Version используют текстовую отрисовку в диагностических целях. Их можно временно вставлять в середину цепочки, чтобы проверить fps, номер кадра, размеры, audio properties и другие параметры. Перед финальным кодированием нужно убедиться, что отладочная надпись удалена: AviSynth не различает служебный overlay и художественный — оба становятся пикселями результата.

Схема: Плагины и автозагрузка

Чересстрочное видео и поля

AviSynth имеет SeparateFields, Weave, DoubleWeave, AssumeTFF, AssumeBFF, ComplementParity и SwapFields для работы с полевой структурой. Они не являются автоматическим деинтерлейсером. AssumeTFF и AssumeBFF задают интерпретацию порядка полей, SeparateFields разделяет поля в последовательность меньшей высоты, Weave снова переплетает их. Ошибка в field order проявляется характерным обратным движением или дрожанием после временной обработки.

Деинтерлейс высокого качества обычно выполняют внешним фильтром. AviSynth+ предоставляет среду, где такой плагин можно загрузить и связать с остальной цепочкой, но само наличие движка не означает встроенную стабилизацию, motion-compensated deinterlace или реставрацию плёнки. Для статьи принципиально отделять возможности ядра от экосистемы плагинов: пользователь должен понимать, какой DLL действительно выполняет тяжёлую обработку.

Перед вертикальным ресайзом чересстрочного материала нужно решить, остаётся ли он interlaced. Простое масштабирование целого кадра смешивает строки разных моментов времени. Правильная схема зависит от цели: деинтерлейс до ресайза, field-aware resize или сохранение полей с корректной обработкой. Порядок должен быть согласован с кодировщиком и форматом выдачи, иначе даже технически успешный рендер получит артефакты движения.

Аудио: обрезка, задержка и объединение

AudioDub берёт видео из одного клипа и аудио из другого. KillAudio удаляет звуковую часть, KillVideo — видеоряд. Эти операции удобны, когда source-плагин надёжнее открывает видео и аудио раздельно или когда нужно заменить дорожку. После AudioDub длительности компонентов могут различаться; внешний хост будет ориентироваться на свойства полученного clip, поэтому финал обязательно проверяют по началу, середине и концу.

DelayAudio сдвигает аудио относительно видео. Положительная и отрицательная задержка решают постоянный offset, но не лечат постепенный drift. Если рассинхрон растёт по мере воспроизведения, нужно проверять sample rate, fps, ошибочное AssumeFPS и способ декодирования источника. Попытка компенсировать нелинейный drift одной задержкой даст совпадение только в одной точке.

ResampleAudio и SSRC меняют частоту дискретизации. ConvertAudioTo8bit, ConvertAudioTo16bit, ConvertAudioTo24bit, ConvertAudioTo32bit и ConvertAudioToFloat преобразуют sample type. Перед склейкой аудиоклипов свойства должны совпадать, поэтому явная нормализация уместна. Но каждое лишнее преобразование — потенциальное округление; рабочий формат лучше выбрать один раз и сохранить до финального кодировщика.

Amplify и AmplifydB меняют уровень, Normalize масштабирует сигнал относительно выбранного максимума, MixAudio смешивает дорожки, GetChannel и MergeChannels позволяют собирать каналы. Это базовые операции, а не микшер с автоматизацией и измерителями громкости по современным broadcast-стандартам. Для нормализации по LUFS, true peak и сложной динамической обработки лучше использовать профильный аудиоинструмент либо внешний плагин, не приписывая эту функцию ядру AviSynth+.

Схема: Многопоточность

Плагины: как расширяется набор функций

LoadPlugin загружает бинарные плагины AviSynth. Современное ядро способно определять C и C++ плагины, а отдельные функции сохраняются для совместимости с C-интерфейсом. LoadVirtualDubPlugin позволяет подключать часть фильтров VirtualDub с оговорками по формату и preroll. Поддержка интерфейса не означает, что любой старый VDF будет корректно работать в многопоточном high-bit-depth скрипте; ограничения конкретного фильтра нужно проверять отдельно.

Автозагрузка экономит повторяющиеся LoadPlugin, но усложняет диагностику конфликтов. AddAutoloadDir добавляет путь в список, ListAutoloadDirs показывает текущие каталоги, ClearAutoloadDirs позволяет начать с чистой конфигурации, а AutoloadPlugins запускает загрузку. Если два плагина экспортируют функцию с одним именем, порядок загрузки влияет на то, какая реализация будет вызвана. Для воспроизводимого проекта полезно либо фиксировать набор autoload, либо загружать критичные DLL явно.

AVSI-файлы в каталогах автозагрузки содержат пользовательские функции и глобальные определения. Основную обработку текущего ролика в AVSI размещать не следует: при автозагрузке такой код может выполняться в неожиданном контексте. Удобная организация — функции и константы в AVSI, конкретные пути, Trim и параметры проекта в основном AVS. Так библиотека скриптов остаётся переиспользуемой.

Разрядность плагина должна совпадать с архитектурой процесса-хоста. 64-битный плеер загружает 64-битный AviSynth и 64-битные DLL; 32-битный процесс требует 32-битную цепочку. Наличие обеих версий AviSynth на одном Windows-компьютере не делает DLL взаимозаменяемыми. Ошибка вроде cannot load DLL часто объясняется именно этим, а также отсутствующей зависимостью Visual C++ runtime или вспомогательной библиотеки.

Если после добавления плагина скрипт падает, сначала исключают автозагрузку и оставляют только этот DLL с минимальным входом подходящего формата. Затем проверяют его документацию: bit depth, colorspace, frame properties, MT safety и зависимые DLL. Такой минимальный тест отделяет проблему плагина от ошибки в большой пользовательской функции.

Многопоточность, Prefetch и совместимость фильтров

AviSynth+ добавляет современную многопоточную модель поверх графа фильтров. Prefetch в конце или подходящей части цепочки позволяет хосту получать несколько кадров параллельно, но реальный прирост зависит от фильтров. Если узкое место однопоточное, зависимо от соседних кадров или использует внутреннюю синхронизацию, увеличение числа потоков не даст линейного ускорения и может увеличить память.

SetFilterMTMode задаёт правила для бинарного фильтра, если его собственная регистрация MT отсутствует или нуждается в переопределении. Режим нельзя выбирать по принципу больше параллелизма всегда лучше. Небезопасный фильтр, принудительно объявленный полностью reentrant, способен выдавать повреждённые кадры или падать. Для современного плагина предпочтительна информация от разработчика и саморегистрация режима.

Некоторые фильтры хранят состояние между кадрами, делают temporal-анализ или используют общий контекст. Для них MT-режим должен учитывать эту архитектуру. При странных артефактах, которые исчезают с одним потоком, следует подозревать несовместимость MT, а не цветовую ошибку. Диагностический алгоритм простой: минимальный скрипт, Prefetch с одним потоком, затем постепенное увеличение и проверка одинаковых кадров.

Кэширование тоже влияет на память. Тяжёлая цепочка 4K 16-bit может занимать много мегабайт на один кадр, а несколько одновременных запросов быстро увеличивают рабочий набор процесса. Если система начинает активно использовать swap, больше Prefetch ухудшит скорость. Оптимальный параметр определяется измерением реального fps, потребления памяти и стабильности, а не количеством логических ядер в системе.

Схема: Сравнение результатов

Передача результата в плеер и кодировщик

AviSynth+ не выбирает H.264, HEVC, AV1, ProRes или другой финальный видеокодек сам по себе. AVS описывает кадры и звук, а внешний потребитель открывает этот виртуальный поток и решает, как его воспроизвести или закодировать. Поэтому параметры CRF, bitrate, GOP, preset, аппаратного кодировщика и контейнера задаются в хосте. В статье это разделено намеренно: иначе frameserver легко принять за универсальный конвертер с собственным модулем экспорта.

Практический процесс выглядит так: скрипт проверяют в совместимом preview-хосте, затем тот же AVS открывают кодировщиком. Если preview и кодирование используют процессы разной архитектуры или разные плагины, результат может отличаться. Например, 64-битный просмотр работает, а 32-битный encoder не видит source DLL. Воспроизводимая среда должна совпадать по bitness и набору зависимостей на обоих этапах.

Очередь заданий тоже принадлежит внешнему кодировщику или автоматизирующему скрипту. AviSynth может параметризовать обработку и один AVS способен включать логику, зависящую от переменных, но встроенного менеджера очереди заданий с профилями контейнеров у движка нет. Для массовой обработки обычно генерируют AVS-файлы, используют шаблон или вызывают один и тот же script через внешнюю CLI-обвязку.

Аппаратное кодирование GPU не является глобальной настройкой AviSynth+. Некоторые внешние фильтры способны вычислять на GPU, а внешний encoder может использовать NVENC, QSV, AMF или другую аппаратную технологию. Это отдельные компоненты. Сам факт, что финальное кодирование идёт на GPU, не означает, что Crop, Trim, ConvertBits или старый denoise-плагин тоже выполняются там.

ImageWriter, SoundOut и специальные выходы

ImageWriter сохраняет выбранные кадры как последовательность изображений. Это удобный способ получить контрольные PNG/BMP-подобные кадры для сравнения или передать последовательность приложению, которое не читает AVS. Однако сохранение каждого кадра отдельно может быстро занять много места и не переносит структуру контейнера. Если нужен конечный видеофайл, рациональнее открыть AVS кодировщиком.

SoundOut относится к специальной аудиофункциональности и может писать или воспроизводить звук в поддерживаемых конфигурациях. Его не следует путать с полноценной аудиостанцией. Для типичного видео-процесса надёжнее оставить аудио в clip и дать внешнему encoder закодировать дорожку одновременно с видео, либо вывести звук отдельным специализированным инструментом.

TCPDeliver существует как механизм передачи кадров по сети между клиентом и сервером AviSynth, но современная документация отдельно предупреждает о его поставке и статусе. Это frameserving, а не сервис прямой трансляции для зрителей. Функции RTMP-сервера, HLS-плейлиста, веб-трансляции, записи экрана или управления вещанием из этого не следуют.

Схема: Диагностика типичных ошибок

Совместимость Windows, macOS, Linux и архитектур

Основной проект поддерживает Windows и POSIX-системы, включая Linux и macOS, а также несколько CPU-архитектур. При этом конкретный скрипт может оставаться платформозависимым из-за плагинов. Например, Subtitle использует Windows-возможности, а многие старые DLL существуют только для x86/x64 Windows. Поэтому переносимость оценивают по всей цепочке, а не по одному ядру.

На Windows официальный релиз предоставляет отдельные варианты установщика, включая обычный x86/x64 пакет, вариант с Microsoft Visual C++ Redistributable и сборку ARM64. В релизе прямо рекомендуется пакет с vcredist пользователю, который не знает, какой вариант выбрать. Это снижает вероятность отсутствующей runtime-библиотеки, но не решает зависимости сторонних плагинов, у которых могут быть собственные требования.

Установка обеих архитектур x86 и x64 нужна только тогда, когда реально используются хосты обеих разрядностей. 32-битный редактор не сможет загрузить 64-битную DLL, даже если рядом установлен 64-битный AviSynth+. Аналогично ARM64-сборка ориентирована на нативный Windows ARM; совместимость конкретных x86/x64 плагинов зависит от того, в каком процессе они запускаются и доступна ли подходящая версия.

На Linux/macOS набор доступных встроенных функций и плагинов отличается от Windows-экосистемы. Text предусмотрен как более переносимый текстовый фильтр, тогда как Subtitle ограничен Windows. DirectShowSource также завязан на Windows DirectShow. Если скрипт должен жить на нескольких ОС, source-фильтры и плагины выбирают изначально с учётом POSIX, а не пытаются переносить готовый Windows-набор DLL.

Как искать ошибку нет такой функции

Сообщение об неизвестной функции обычно означает одну из трёх причин: функция действительно не встроена, нужный плагин не загрузился или имя отличается от ожидаемого. Сначала нужно найти строку вызова и определить происхождение функции. Если это внешняя DLL, проверяют LoadPlugin или каталоги autoload. Если это AVSI-функция, проверяют, что файл находится в загружаемом каталоге и не содержит ошибки синтаксиса до определения функции.

После этого сверяют архитектуру процесса и DLL. 64-битный файл не становится доступным 32-битному хосту только из-за того, что лежит в plugins. Если LoadPlugin выдаёт ошибку загрузки, полезно проверить и вторичные зависимости DLL. Нередко сам плагин найден, но операционная система не может загрузить библиотеку, от которой он зависит.

Третий уровень — конфликт имён. Автозагруженный плагин может экспортировать функцию с тем же именем, что другой плагин или встроенная функция. AviSynth предусматривает механизм префикса на основе имени DLL для разрешения части таких конфликтов. В диагностике проще временно очистить autoload и загрузить нужные DLL явно в известном порядке.

Схема: Передача в кодировщик

Как исправлять ошибки несовместимых клипов

Фильтры с несколькими входами предъявляют требования к свойствам clip. Для AlignedSplice нужны одинаковые размеры, pixel format и fps, а аудиопараметры тоже должны совпадать. Для StackHorizontal высота и формат должны позволять объединение, для Overlay требования иные. Поэтому сообщение о несовместимости следует читать в контексте конкретного фильтра, а не применять один универсальный ConvertToYV12 ко всем ветвям.

Полезно вывести Info отдельно для каждой ветви непосредственно перед проблемной операцией. Так видно width, height, fps, frame count, audio rate, channels и формат. Затем исправляют только реальное различие: Resize для геометрии, ConvertTo для pixel format, ResampleAudio для sample rate. AssumeFPS используют только если требуется именно переинтерпретация времени; для реального преобразования частоты выбирают соответствующий fps-фильтр.

Если ветви получены из одного источника разными фильтрами, несовместимость может возникнуть неожиданно из-за внешнего плагина, который меняет bit depth, chroma subsampling или frame properties. В таком случае нормализацию лучше делать после каждой ветви перед точкой объединения. Это делает граф явным и упрощает замену плагина в будущем.

Ошибки источника, seek и декодирования

Если AVS открывается, но переход к далёкому кадру зависает или показывает неправильный кадр, причина может быть в source-фильтре. DirectShow-декодеры не обязаны обеспечивать точный seeking. При длинном GOP и сложном контейнере специализированный индексирующий source-плагин обычно предсказуемее. Сам Trim не может исправить неточное декодирование: он запрашивает кадры по номерам и зависит от того, что источник возвращает правильные позиции.

Неверный fps от источника проявляется не только скоростью воспроизведения. Он влияет на длительность, аудиосинхронизацию, таймкоды диагностических фильтров и поведение операций, выраженных через время. DirectShowSource позволяет задать fps вручную, но это следует делать только при известном правильном значении. Для VFR-материала постоянное число fps может быть принципиально недостаточным описанием исходного времени.

Повреждённый файл, нестабильный decoder и аппаратное ускорение DirectShow могут давать ошибки, которые выглядят как проблема AviSynth. Минимальная проверка — открыть источник без обработки, затем тот же файл альтернативным надёжным source-плагином. Если дефект повторяется только в одном декодере, менять Crop или Prefetch бессмысленно.

Схема: Чересстрочное видео

Стабильность и память

Out of memory не всегда означает, что физической RAM мало. 32-битный процесс ограничен адресным пространством и может исчерпать его значительно раньше 64-битного. Кроме того, high-bit-depth 4K кадры, temporal-плагины и большой Prefetch создают множество одновременно живущих буферов. Первый шаг — уменьшить многопоточность и проверить, исчезает ли ошибка.

Если сбой происходит на одном и том же кадре независимо от потоков, вероятнее повреждён источник или ошибка конкретного фильтра. Если позиция меняется от запуска к запуску и проблема исчезает при Prefetch(1), подозрение падает на MT-совместимость. Такой тест не доказывает виновника окончательно, но помогает отделить детерминированную ошибку данных от гонки между потоками.

Кэш нельзя настраивать только по принципу больше памяти лучше. Temporal-фильтры могут иметь собственное кэширование, а хост также буферизует кадры. Реальный критерий — стабильный fps без swap и без чрезмерного роста рабочего набора. Для пакетного кодирования несколько параллельных процессов иногда работают хуже одного хорошо настроенного процесса, потому что конкурируют за память и cache CPU.

Практический сценарий: точная вырезка сцен

Для точной нарезки сначала выбирают source-фильтр с надёжным покадровым seek. Исходник сохраняют в переменную src, временно добавляют ShowFrameNumber и находят границы сцен. Затем диагностический overlay убирают, а фрагменты формируют как src.Trim(a,b), src.Trim(c,d) и так далее. Такой способ не зависит от того, как меняется нумерация после первой обрезки.

Если сохраняется исходное аудио, фрагменты лучше вырезать из общего audio+video clip и соединить AlignedSplice. Тогда звуковая дорожка следует тем же границам. После склейки проверяют несколько стыков в наушниках: короткий щелчок может появиться, если монтажная точка неудачна для звуковой волны, даже когда синхронизация математически верна. Для критичного аудио стык дорабатывают отдельными аудиофильтрами или внешним редактором.

После монтажа не обязательно сразу кодировать. Можно открыть AVS в preview-хосте и перейти непосредственно к стыкам, потому что frameserver вычислит нужные кадры по запросу. Это одно из сильных применений AviSynth: монтажное решение остаётся текстом, а повторный тест другого Trim не требует промежуточного render-файла.

Схема: Операции с кадрами

Практический сценарий: подготовка кадра к кодированию

Типовая цепочка подготовки включает источник, Crop для удаления ненужных краёв, корректный resize, при необходимости преобразование цвета и bit depth, затем финальный clip для encoder. Порядок нельзя считать механическим. Если фильтр реставрации должен анализировать исходный шум, его часто применяют до сильного resize; если внешний плагин принимает только определённый формат, ConvertTo ставят на его границе.

Для 10-bit источника разумно сохранить повышенную разрядность на протяжении тех фильтров, которые её поддерживают, а снижение до 8 bit выполнить один раз с dither непосредственно перед 8-bit-only выходом. Если кодировщик принимает 10 bit, снижать разрядность вообще не требуется. Это не означает, что 8-bit материал станет 10-bit качеством после ConvertBits; речь только о предотвращении лишнего накопления округлений.

Перед финалом проверяют чётность размера, pixel format, диапазон и chroma placement, ожидаемые кодировщиком. Ошибка здесь может проявиться уже на стороне encoder. Поскольку AviSynth отделён от кодировщика, сообщение внешней утилиты нужно сопоставлять с тем, какие кадры реально выдаёт AVS.

Практический сценарий: сравнение двух фильтров

Для честного A/B-теста создают две ветви из одной переменной src. В каждой меняют только один фактор — например resizer или параметры denoise-плагина. Затем приводят ветви к одинаковым размерам и форматам и используют StackHorizontal, StackVertical или Interleave. Если одновременно поменять bit depth, матрицу и резкость, результат уже не показывает влияние одного фильтра.

Overlay с маской или Crop может организовать split-screen, где левая часть кадра берётся из версии A, а правая из B. Для оценки тонких различий Subtract показывает математическую разность. Нельзя делать вывод по одному яркому кадру: temporal-фильтр может вести себя иначе на движении, а resize — на разных текстурах. Выбирают несколько характерных сцен и проверяют одинаковые frame numbers.

Когда вариант выбран, сравнительные фильтры удаляют из финальной ветви. Это кажется очевидным, но в текстовых цепочках легко оставить StackHorizontal или Subtitle, если тестовый блок был встроен в last. Безопаснее хранить final отдельно и возвращать его в последней строке, а preview строить в отдельной переменной.

Схема: Контроль перед финалом

Практический сценарий: работа с захватом и чересстрочным материалом

AVI-захват с предсказуемым VfW-кодеком удобно открывать AVISource. Сначала проверяют порядок полей и отсутствие пропусков. Crop выполняют с учётом chroma и полей; вертикальные операции, смешивающие строки, откладывают до корректной field-aware обработки. Если материал нужно деинтерлейсить, используют подходящий внешний фильтр и отдельно фиксируют его MT-режим, если это требуется документацией плагина.

Сегменты, записанные подряд одним захватом, иногда лучше соединять UnalignedSplice, потому что их аудио изначально непрерывно. Это один из немногих случаев, где выбор отличается от общего совета использовать AlignedSplice. После объединения проверяют стык по waveform или на слух и убеждаются, что ни один сегмент не имеет отличающийся sample rate.

Стабилизация дрожащего изображения не является встроенной общей функцией AviSynth+. Для неё используют внешние motion-analysis плагины или отдельный инструмент. В статье важно не превращать наличие экосистемы в утверждение о базовом ядре: без конкретного плагина AviSynth сам не вычисляет траекторию камеры.

Практический сценарий: синхронизация отдельной аудиодорожки

Видео и аудио открывают независимыми source-фильтрами, затем измеряют постоянный offset. DelayAudio исправляет фиксированное смещение, после чего дорожку соединяют с видео через AudioDub. Проверять нужно не только начало: если через двадцать минут совпадение ушло, причина не в одном offset. Тогда сравнивают длительность, fps видео и sample rate аудио.

Если известна правильная частота дискретизации, аудио можно привести ResampleAudio или SSRC. Но ресемплинг не должен маскировать ошибочно интерпретированную скорость. Аналогично AssumeFPS может случайно заставить финальные длительности совпасть, но изменить темп видеоряда. Сначала устанавливают причину drift, и только потом меняют временную базу.

После AudioDub проверяют каналы и sample type. Если внешний encoder ожидает определённый формат, AviSynth способен преобразовать аудио, но часто кодировщик сам принимает float или integer PCM и выполняет нужную подготовку. Лишняя конверсия в скрипте не приносит пользы, если не решает конкретное ограничение следующего звена.

Практический сценарий: пакетная повторяемая обработка

Сильная сторона AVS — параметры обработки можно держать в одном шаблоне. Для серии файлов с одинаковой геометрией и требованиями создают пользовательскую функцию, которая принимает clip, выполняет Crop, resize, цветовую нормализацию и возвращает результат. В каждом проектном AVS остаётся только source и значения, специфичные для материала. Это уменьшает риск, что один файл был обработан по случайно изменённой цепочке.

Если файлы отличаются по размеру или формату, автоматические условия следует делать консервативно. Проверка Width, Height, IsYUV или BitsPerComponent позволяет выбрать ветвь, но автоматическое преобразование не должно угадывать цветовую матрицу только по разрешению без подтверждения. Для критичных архивных материалов метаданные и фактический сигнал проверяют отдельно.

Запуск серии файлов выполняет внешняя командная оболочка или encoder с очередью. AviSynth не хранит историю заданий и не управляет лимитом параллельных кодирований. Если стартовать несколько тяжёлых AVS одновременно, они конкурируют за CPU и память. Планировщик внешнего процесса должен учитывать реальный ресурс одной цепочки.

Что AviSynth+ не делает сам

У программы нет собственного нелинейного интерфейса с дорожками и перетаскиванием клипов. Нет встроенного браузера медиа, менеджера проектов, окна экспорта с пресетами устройств, авторинга DVD/Blu-ray, записи экрана или системы прямых трансляций. Наличие фильтра для одной низкоуровневой операции нельзя расширять до этих классов задач.

Декодирование современных контейнеров и кодеков часто обеспечивают внешние source-плагины. Поэтому формулировка поддерживает MKV или AV1 без уточнения вводит в заблуждение. Корректно говорить, что AviSynth+ может обрабатывать кадры, которые ему отдаёт совместимый source-фильтр; конкретный контейнер и codec определяются этим источником.

Нет универсального встроенного motion stabilizer, сложного subtitle-редактора, scene detector с монтажными решениями или GPU-движка для всех фильтров. Экосистема может содержать плагины для части этих задач, но их установка, лицензия, bitness и поддерживаемые форматы отличаются. Если статья описывает плагин, он должен быть назван как внешняя зависимость, а не как кнопка базового AviSynth+.

Сам AVS не является финальным медиаконтейнером. Это рецепт и виртуальный источник для хоста. Если отправить AVS пользователю без исходных файлов, плагинов и совпадающей среды, он может не открыться. Для архивирования проекта нужно сохранять список зависимостей, относительные пути или понятную структуру каталогов и параметры внешнего encoder.

Практический справочник операций AviSynth+

Ниже собраны точечные операции, которые чаще всего встречаются в рабочих AVS-цепочках. Каждая заметка отделяет назначение функции от ограничения и контрольной проверки, чтобы скрипт можно было диагностировать по шагам.

AVISource

AVISource применяют для задачи открытие AVI через VfW. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: проверить наличие подходящего Video for Windows декодера той же архитектуры. После добавления функции разумно проверить первый, средний и последний кадр, а также аудиодорожку. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

DirectShowSource

DirectShowSource применяют для задачи запасное открытие через DirectShow. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: seek и fps зависят от установленной DirectShow-цепочки и не обязаны быть покадрово точными. После добавления функции разумно проверить случайный переход к нескольким дальним кадрам и длительность. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

ImageSource

ImageSource применяют для задачи сборка ролика из изображения или нумерованной последовательности. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: fps задаётся скриптом, а часть форматов зависит от DevIL. После добавления функции разумно проверить диапазон номеров, размеры и реальную длительность результата. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Trim

Trim применяют для задачи выделение диапазона кадров. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: последний кадр в обычной форме включается, а новый clip снова нумеруется с нуля. После добавления функции разумно проверить границы через ShowFrameNumber до удаления диагностики. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

AudioTrim

AudioTrim применяют для задачи точная обрезка аудио. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: для чисто аудиоклипа он предпочтительнее Trim и может работать с временными или сэмпловыми границами. После добавления функции разумно проверить стык на слух и итоговое число сэмплов. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

AlignedSplice

AlignedSplice применяют для задачи последовательное соединение фрагментов с учётом синхронизации. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: входы должны совпадать по видео- и аудиосвойствам. После добавления функции разумно проверить несколько кадров и десятки миллисекунд звука вокруг каждого стыка. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

UnalignedSplice

UnalignedSplice применяют для задачи соединение изначально непрерывных сегментов. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: звук конкатенируется без выравнивания относительно видео. После добавления функции разумно проверить не появляется ли щелчок или накопленный сдвиг на стыке. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Dissolve

Dissolve применяют для задачи плавное перекрытие двух клипов. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: размеры и цветовые форматы должны быть совместимы, а overlap задаётся кадрами. После добавления функции разумно проверить начало, середину и конец перехода. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

DeleteFrame

DeleteFrame применяют для задачи удаление единичных видеокадров. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: операция может изменить временное соответствие звуку. После добавления функции разумно проверить длительность и синхронизацию после серии удалений. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

DuplicateFrame

DuplicateFrame применяют для задачи повтор конкретных кадров. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: повтор увеличивает видеопоследовательность без автоматического исправления отдельного аудио. После добавления функции разумно проверить движение и синхронизацию вокруг вставки. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

FreezeFrame

FreezeFrame применяют для задачи замена диапазона одним выбранным кадром. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: аудио при этом не превращается в тишину автоматически. После добавления функции разумно проверить отсутствие скачка изображения на входе и выходе диапазона. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

SelectEvery

SelectEvery применяют для задачи выбор позиций из повторяющегося цикла кадров. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: неверный offset меняет фазу выборки и может разрушить порядок полей. После добавления функции разумно проверить первые несколько циклов с наложенным номером кадра. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

SelectEven / SelectOdd

SelectEven / SelectOdd применяют для задачи быстрый выбор чётных или нечётных позиций. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: это не универсальный деинтерлейс и может менять временное разрешение. После добавления функции разумно проверить движущуюся сцену, а не только статичный кадр. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

AssumeFPS

AssumeFPS применяют для задачи переинтерпретация частоты кадров. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: не создаёт новых кадров и меняет длительность последовательности. После добавления функции разумно проверить совпадение длительности и аудио после операции. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

ChangeFPS

ChangeFPS применяют для задачи получение новой частоты выбором или повторением кадров. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: движение может стать неравномерным из-за повторов или пропусков. После добавления функции разумно проверить панорамы и титры с постоянной скоростью. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

ConvertFPS

ConvertFPS применяют для задачи преобразование частоты с собственным способом смешения. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: результат отличается от простого AssumeFPS и требует визуальной проверки движения. После добавления функции разумно проверить контрастные движущиеся границы. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Crop

Crop применяют для задачи удаление краёв кадра. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: YUV subsampling накладывает ограничения на координаты и размеры. После добавления функции разумно проверить геометрию и отсутствие chroma-сдвига по границе. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

AddBorders

AddBorders применяют для задачи добавление полей вокруг изображения. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: цвет и итоговый размер должны соответствовать дальнейшей цепочке. После добавления функции разумно проверить точные размеры Width и Height после операции. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Letterbox

Letterbox применяют для задачи затемнение выбранных краёв без обычного Crop. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: он не возвращает потерянное соотношение сторон сам по себе. После добавления функции разумно проверить что полезная область не перекрыта. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

BilinearResize

BilinearResize применяют для задачи мягкое масштабирование. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: при сильном уменьшении может выглядеть слишком мягко. После добавления функции разумно проверить тонкие линии и текст рядом с более резким resizer. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

BicubicResize

BicubicResize применяют для задачи масштабирование с управляемым кубическим ядром. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: параметры b и c влияют на резкость и ringing. После добавления функции разумно проверить ореолы вокруг контрастных границ. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

LanczosResize

LanczosResize применяют для задачи резкое масштабирование sinc-подобным ядром. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: на некоторых материалах усиливает ringing. После добавления функции разумно проверить контрастные титры, провода и геометрические узоры. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Spline36Resize

Spline36Resize применяют для задачи сбалансированный сплайновый resize. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: качество всё равно зависит от масштаба и исходной детализации. После добавления функции разумно проверить A/B с альтернативным kernel на нескольких сценах. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

PointResize

PointResize применяют для задачи масштабирование ближайшим соседом. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: не подходит для обычного фото-видео, но полезно для пиксельных тестов и масок. После добавления функции разумно проверить не появились ли неожиданные полутоновые значения. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

ConvertToRGB / ConvertToYUV

ConvertToRGB / ConvertToYUV применяют для задачи смена цветовой модели. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: нужно корректно задать матрицу, диапазон и chroma placement, если они не выводятся однозначно. После добавления функции разумно проверить уровни Histogram и нейтральные серые участки. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

ConvertBits

ConvertBits применяют для задачи смена разрядности. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: понижение может требовать dither, а повышение не создаёт отсутствующую информацию. После добавления функции разумно проверить градиенты и ограничение диапазона. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Levels

Levels применяют для задачи переназначение входных и выходных уровней. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: неправильные точки black/white приводят к клиппингу. После добавления функции разумно проверить тени, света и Histogram levels. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Tweak

Tweak применяют для задачи коррекция оттенка, насыщенности и базовых уровней. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: большие значения быстро дают неестественный цвет. После добавления функции разумно проверить кожу, нейтральные области и цветовые шкалы. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

ColorYUV

ColorYUV применяют для задачи математические изменения YUV-компонентов. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: параметры следует выбирать по измерению, а не для компенсации неверного range. После добавления функции разумно проверить min/max и распределение уровней. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Histogram

Histogram применяют для задачи визуальная диагностика уровней и компонентов. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: это инструмент контроля, его панель не должна остаться в финальном видео. После добавления функции разумно проверить одни и те же кадры до и после цветовой операции. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Overlay

Overlay применяют для задачи композиция клипа поверх базы. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: маска, диапазон и рабочий формат влияют на непрозрачность и chroma. После добавления функции разумно проверить края маски и цвета в зоне наложения. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Mask / MaskHS

Mask / MaskHS применяют для задачи создание или применение масок. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: маска должна иметь ожидаемую геометрию и диапазон. После добавления функции разумно проверить чёрные, белые и полупрозрачные области отдельно. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

StackHorizontal

StackHorizontal применяют для задачи размещение версий рядом. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: входы должны иметь совместимые свойства и подходящую высоту. После добавления функции разумно проверить что сравнивается один и тот же frame number. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

StackVertical

StackVertical применяют для задачи вертикальное сравнение вариантов. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: итоговая высота увеличивается и может стать неудобной для хоста. После добавления функции разумно проверить масштаб просмотра без дополнительного скрытого resize. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Interleave

Interleave применяют для задачи чередование кадров нескольких клипов. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: порядок клипов определяет последовательность, а fps результата меняется по правилам фильтра. После добавления функции разумно проверить чётность позиции при A/B-листании. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Subtract

Subtract применяют для задачи визуализация разности двух клипов. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: разность легко неверно интерпретировать без понимания представления пикселей. После добавления функции разумно проверить контрольный случай из двух идентичных ветвей. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Blur

Blur применяют для задачи простое размытие. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: не заменяет специализированный denoise и снижает локальный контраст. После добавления функции разумно проверить мелкую фактуру на нескольких типах сцен. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Sharpen

Sharpen применяют для задачи простое повышение резкости. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: может усилить шум и ореолы. После добавления функции разумно проверить контрастные границы и зерно. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

TemporalSoften

TemporalSoften применяют для задачи временное смягчение шумов. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: движение ограничивает безопасную силу фильтра. После добавления функции разумно проверить быстрые объекты и смены сцен. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

SpatialSoften

SpatialSoften применяют для задачи пространственное смягчение. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: сильные параметры стирают мелкие детали вместе с шумом. После добавления функции разумно проверить волосы, траву, ткань и текстуры. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Subtitle

Subtitle применяют для задачи нанесение антиалиасного текста в Windows. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: надпись прожигается в кадр и не становится отдельной subtitle-дорожкой. После добавления функции разумно проверить первый и последний кадр указанного диапазона. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Text

Text применяют для задачи переносимая упрощённая текстовая отрисовка. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: bitmap-шрифты и набор возможностей ограничен по сравнению с Subtitle. После добавления функции разумно проверить читаемость символов на целевой ОС. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

ShowFrameNumber

ShowFrameNumber применяют для задачи временная нумерация кадров. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: диагностический overlay необходимо убрать перед кодированием. После добавления функции разумно проверить границы Trim и правильность seek источника. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Info

Info применяют для задачи просмотр ключевых свойств clip. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: показывает состояние текущей точки графа, а не свойства исходного файла вообще. После добавления функции разумно проверить ветви непосредственно перед операцией, которая выдаёт ошибку. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

AudioDub

AudioDub применяют для задачи сборка видео и аудио из разных клипов. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: длительности и временные базы могут не совпадать. После добавления функции разумно проверить начало, середину и конец результата. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

DelayAudio

DelayAudio применяют для задачи исправление постоянного аудиосдвига. В AviSynth+ такую операцию удобно держать отдельной строкой или отдельной именованной ветвью, чтобы было понятно, в какой точке меняется поток. Ключевое ограничение: не устраняет постепенно растущий drift. После добавления функции разумно проверить две далеко расположенные контрольные точки. Если ошибка появляется только после этой строки, нужно диагностировать её входные свойства и происхождение функции, а не перестраивать всю цепочку сразу.

Сравнение AviSynth+ с аналогами

ПрограммаЛучше подходит дляГлавное ограничение
AviSynth+Покадровых AVS-цепочек, старой и современной экосистемы AviSynth-плагинов, frameserving в совместимые Windows-хостыРабота строится скриптом; финальный кодировщик и многие source-фильтры внешние
VapourSynthСовременных Python-скриптов обработки кадров, high-bit-depth пайплайнов и плагинов его собственной экосистемыПлагины AviSynth нельзя считать автоматически совместимыми; нужен отдельный набор фильтров
FFmpegДекодирования, фильтрации и кодирования в одной CLI-команде, массовой конвертации контейнеров и кодековСложные покадровые скрипты и ветвящиеся реставрационные цепочки читаются иначе, чем AVS-граф
VirtualDub2Визуального просмотра, простой покадровой обработки и работы с фильтрами в оконном интерфейсеНе заменяет гибкий текстовый граф AviSynth и не использует всю AVS-экосистему как нативный скриптовый движок
GStreamerМодульных мультимедийных графов, приложений, захвата и потоковой обработки через плагиныПорог входа и архитектура ориентированы на мультимедийные pipelines, а не на привычные AVS-рецепты реставрации

Если требуется воспроизводимая покадровая обработка с существующими AviSynth-фильтрами, AviSynth+ остаётся логичным выбором. VapourSynth удобнее там, где цепочка уже строится вокруг Python и его плагинов; FFmpeg — когда ключевая задача состоит в декодировании и кодировании с фильтрами в одном CLI-процессе; VirtualDub2 — когда приоритетом является визуальное управление; GStreamer — когда нужен программируемый мультимедийный pipeline шире обычного frameserving.

Контрольный список перед финальным кодированием

  • Открыть AVS в том же типе хоста и той же разрядности, которые будут использоваться для кодирования.
  • Проверить начало, середину и последние кадры источника, а для длинного GOP — несколько произвольных переходов.
  • Убедиться, что Trim попал на нужные границы и диагностические ShowFrameNumber, Info, Histogram или Subtitle удалены.
  • Сверить Width, Height, fps, pixel format и BitsPerComponent непосредственно перед encoder.
  • Проверить full/limited range и цветовую матрицу после последней цветовой конверсии.
  • Прослушать аудио в начале, середине и конце; постоянный offset и нарастающий drift диагностировать отдельно.
  • Убедиться, что все внешние плагины соответствуют архитектуре процесса и не подменяются одноимёнными функциями из autoload.
  • Если используется Prefetch, прогнать длинный фрагмент и проверить стабильность, память и повторяемость кадров.
  • Не переносить настройки кодека в описание AviSynth: bitrate, CRF, preset, контейнер и аппаратный encoder задаются внешним хостом.
  • Сохранить рабочий AVS вместе со списком внешних DLL/AVSI и параметрами source-плагина, если проект должен повторяться на другом компьютере.

AviSynth+ лучше всего раскрывается там, где обработку нужно выразить точно и повторяемо: каждый шаг виден в тексте, промежуточные ветви можно сравнить, а результат пересчитывается по запросу потребителя. Надёжность достигается не количеством фильтров, а контролем входных свойств, минимальным числом лишних конверсий и ясным разделением обязанностей между source-плагином, ядром AviSynth, внешними фильтрами и кодировщиком.