## Начало работы

Обычно работа с AviSynth строится таким образом: Сначала Вы создаете простой текстовый документ со специальными командами, называемый скриптом (т.е. сценарием, программой на языке Avisynth), и сохраняете файл. Эти команды соотносят один или несколько видео-клипов с фильтрами, которыми Вы хотите их обработать. Затем Вы запускаете видео-приложение, например VirtualDub, и открываете в нем этот файл скрипта (скрипт-файл). Тогда и начинает работать AviSynth. Он открывает видео-клипы, на которые ссылаются фильтры в скрипте, выполняет фильтрование и передает результат видео-приложению. Приложение при этом и не подозревает, что имеет дело с AviSynth-ом, работающем в фоновом режиме. Наоборот, приложение считает, что оно работает напрямую с уже ранее отфильтрованными видео-клипами, находящимися у Вас на жестком диске.

В версиях AviSynth 2.х введена новая функциональность, а часть функций преобразованы (по сравнению с AviSynth 1.0). Чтобы четче выделить пункты, касающиеся новой функциональности (особенно недостаточно хорошо документированные ранее), они помечены v2

Версия 2.5 претерпела большие внутренние изменения. Перед ее использованием прочтите внимательно AviSynth 2.5. Соответствующие изменения помечены v2.5

#### Линейное редактирование:

Простейшее, что Вы можете выполнить с помощью AviSynth - того же сорта, что вы можете выполнить в VirtualDub. Скрипты при этом просты для написания: вам нет нужды волноваться о переменных и сложных выражениях если вы этого не хотите.

Для начала создайте файл с именем version.avs (или любым другим, лишь бы расширение было AVS) и вставьте туда следующую единственную строку текста:

    Version

Теперь запустите, например, Windows Media Player, откройте в нем Ваш файл и Вы должны увидеть 10-секундный видео-клип, показывающий номер версии AviSynth и copyright-информацию.

`Version` - то, что можно назвать "фильтром-источником", подразумевая, что он формирует новый клип вместо модификации существующего. Первой командой в скрипте AviSynth должен быть фильтр-источник.

Теперь добавьте вторую строчку в файл скрипта, так что он должен читаться так:

    Version
    ReduceBy2

Снова откройте этот файл в Media Player. Вы снова должны увидеть информацию о версии, но в половину прежнего размера.
`ReduceBy2` - "трансформирующий фильтр", это значит, что он берет предшествующий клип и каким-то образом модифицирует его. Вы можете собрать последовательно множество трансформирующих фильтров, как в VirtualDub.
Например добавим еще один, чтобы сделать наше видео затухающим в темноту в конце. Добавим еще строчку в файл скрипта:

    Version
    ReduceBy2
    FadeOut(10)

Опять откроем файл. Клип должен быть таким же первые 9 секунд и затем, на последней секунде должен плавно перейти в черный. Фильтр FadeOut берет целочисленный аргумент, который показывает число кадров, в течении которых идет затухание.

Проходит много времени до начала затухания, так что давайте отрежем начало клипа для уменьшения ожидания.
Давайте отбросим первые 120 кадров и сохраним кадры 120-150:

    Version
    ReduceBy2
    # отрезать первые 119 кадров и сохранить кадры 120-150
    # (AviSynth начинает отсчет с кадра 0)
    Trim(120,150)
    FadeOut(10)

В этом примере впервые использован комментарий.
Комментарий начинается с символа #, продолжается до конца строки и полностью игнорируется AviSynth.
Фильтр Trim требует два аргумента разделенных запятой: первый и последний кадр части клипа, которую следует сохранить. Если передать 0 как номер последнего кадра, то это будет аналогично концу клипа, так что если Вы просто желаете удалить первые 119 кадров, можно использовать команду Trim(120,0).

Помнить число кадров таким образом муторно. Гораздо легче открыть частично-готовый клип в приложении типа VirtualDub, которое покажет вам номера кадров. Вы также можете использовать фильтр ShowFrameNumber, который впечатает номер кадра в клип.

На практике гораздо более используемым фильтром нежели Version будет AVISource, считывающий AVI-файл (или один из нескольких других типов файлов) с диска. Если у Вас под рукой есть AVI-файл, Вы можете попробовать использовать те же фильтры на нем:

    AVISource("d:\capture.avi")  # проставляется нужный путь к файлу
    ReduceBy2
    FadeOut(15)
    Trim(120,0)

Даже однострочный скрипт, содержащий только команду `AVISource`, может быть весьма полезен для добавления поддержки AVI-файлов >2GB к приложениям, поддерживающим только файлы <2GB.

#### Нелинейное редактирование:

Теперь перейдем к более веселой части. Сделаем AVI-файл со следующим скриптом внутри:

    StackVertical(Version, Version)

Теперь откроем его. Результат: Выходное видео имеет две идентичных строчки информации о версии, одна над другой.
Вместо взятия чисел или строк как аргументов, StackVertical берет в качестве аргументов видео-клипы. В этом скрипте фильтр Version вызывается дважды. Каждый раз, метод возвращает копию клипа о версии. Эти два клипа затем передаются в StackVertical, который объединяет их вместе (не интересуясь их происхождением).

Один из наиболее используемых фильтров такого типа это UnalignedSplice, который соединяет видео-клипы друг-за-другом. Вот скрипт, который грузит три AVI-файла (которые могут быть созданы AVI_IO) и объединяет их вместе.

    UnalignedSplice(AVISource("d:\capture.00.avi"), \
      AVISource("d:\capture.01.avi"), \
      AVISource("d:\capture.02.avi"))

Обе команды, StackVertical и UnalignedSplice могут принимать как минимум два и как максимум шестьдесят аргументов.
Вы можете использовать оператор "+" как короткий псевдоним для UnalignedSplice.

К примеру, такой скрипт делает тоже, что и предыдущий:

    AVISource("d:\capture.00.avi") + \
      AVISource("d:\capture.01.avi") +  \
      AVISource("d:\capture.02.avi")

Давайте теперь предположим, что Вы захватываете видео, используя приложение, которое сохраняет видео в различных AVI сегментах, а звук помещает в отдельном WAV файле. Можем ли мы воссоединить все? Ваш выбор:

    AudioDub(AVISource("d:\capture.00.avi")+ \
      AVISource("d:\capture.01.avi")+ \
      AVISource("d:\capture.02.avi"),  \
      WAVSource("d:\audio.wav"))

## Синтаксис (Syntax)

#### Выражения (Expressions):

Скрипт AviSynth содержит множество строк утверждений такого вида:

    variable_name = expression

В этом примере результат вычислений выражения expression присваивается переменной variable_name.

Очень важна общепринятая сокращенная форма:

    expression

В данном случае происходит вычисление expression и результат присваивается специальной переменной (клипу) last (что означает "последний").
Это аналогично

    last = expression

Конец скрипта часто выглядит так:

    return expression

Здесь происходит вычисление expression и его результат используется в качестве "возвращаемого значения" скрипта - это и будет видео-клип который покажет приложение, в котором открыли AVS-файл.
Если команда return не указана в явном виде, то скрипт возвращает в конце своей работы клип last ("последний").

Основная форма выражения, которое выполняет функцию:

    Function(args)

Функции работы с клипами всегда производит новый видео-клип, никогда не модифицируя существующий,
Args представляет список аргументов функции, разделяемых запятой. Этот список может быть пустым (подразумевается, что все или часть из аргументов являются необязательными)

Если функция-фильтр ожидает клип в качестве своего первого аргумента, а этот аргумент не указан, то этот клип берется из переменной last

Фильтры AviSynth могут принимать также именованные аргументы. Они могут указываться в любом порядке,
и фильтр будет подставлять значения по умолчанию для всех пропущенных аргументов (именованные аргументы всегда необязательны).
Это делает определенные фильтры намного более удобными в применении.

    Можно написать

    Subtitle("Hello, World!", text_color=$00FF00, x=100, y=200)

    вместо

    Subtitle("Hello, World!", 100, 200, 0, 999999, "Arial", 24, $00FF00)

Альтернативный синтаксис (называемый "ООП-записью" - в стиле объектно-ориентированного программирования) для клиповых функций:

    expression.Function(args)

    например:
    Version.ReduceBy2.FadeOut(15)

что эквивалентно

    Function(expression, args)

    например:
    FadeOut(15, ReduceBy2(Version))

и подразумевает приложение функции `Function` к выражению `expression`.
Одно из неудобств ООП-записи - это возможность ее использования только для фильтров с единственным аргументом типа клип, но никак не для фильтров с несколькими такими аргументами.

Все AviSynth-функции производят определенное количество кадров с определенной частотой кадров (framerate), даже если выражение выглядит очень сложным.
AviSynth, прочитав скрипт, знает какой длины будет выходной клип, какую он будет иметь частоту кадров и соответственно последовательность нарезки кадров из всех используемых источников.
Все это вычисляется при открытии скрипта. Только фактическая фильтрация производится во время выполнения по запросу (кадров).

Комментарий (Comments): AviSynth игнорирует все, начиная от символа # и до конца строки.

    # комментарий

В версии v2.58 добавлена возможность размещать блок комментариев и вложенный комментарий следующим образом:

    # блок комментариев:
    /*
    comment 1
    comment 2
    */

    # вложенный комментарий:
    [* [* a meaningful example with follow later :) *] *]

AviSynth игнорирует все от ключевого слова `__END__` (с двойными подчеркиваниями) и до конца файла скрипта. Это можно использовать для запрета выполнения некоторых команд скрипта.

    Version()
    __END__
    ReduceBy2()
    Результат будет без уменьшения (без действия команды ReduceBy2) и мы можем здесь писать любой текст

Игнорирование больших-малых букв (Ignore Case): aViSouRCe ничуть не хуже AVISource.

Продолжение (Continue) на следующей строке: \

    Subtitle ("Test-Text")

    Subtitle ( \
              "Test-Text")

    Subtitle (
     \ "Test-Text")

#### Переменные (Variables):

Имя переменной может быть длиной до 50 символов (реально - более чем 4000 символов в Avisynth v2.56) и содержать буквы (только латинские), цифры и подчеркивание (_), но никакие другие символы. Имя не может начинаться с цифры.

Вы можете использовать символы из вашей языковой системной кодовой страницы (локали) в строках и именах файлов (только ANSI 8 бит, не Unicode).

Возможно использование таких типов переменных:

clip: видео-клип, содержащий видео и/или звук. Как минимум одна переменная типа клип должна использоваться и возвращаться скриптом.
string: строка - окружается либо "кавычками" (маркерами цитирования) либо тройными кавычками как в """этом примере""". Текстовая строка может содержать любые символы кроме прерывающих кавычек или двойного апострофа. Если необходимо включить внутрь строки кавычки, следует использовать тройные кавычки:

    Subtitle ("""Это покажет "hello world" в кавычках""")

int: целое - вводится как строка цифр, возможно дополненная + или - в начале.
float: вводится как строка цифр с десятичной точкой (.) там где нужно, и дополненная + или - в начале при необходимости. Например, +1. трактуется как число с плавающей десятичной точкой (floating-point number).
val: тип аргумента функции, для которого не имеет значения, целочисленный он или с десятичной точкой
bool: логическое - может иметь значения только TRUE (истина) или FALSE (ложь)
hexadecimal numbers: шестнадцатеричное число - вводится с предшествующим знаком $. Такая переменная подразумевается целочисленной. Некоторые фильтры используют такое представление для задания цвета. Например, $FF8800 задает темно-оранжевый.

global: определяет глобальную переменную, которая может быть использована всеми определенными пользователем (user-defined) функциями так же как и основным скриптом.

Вот другая версия ранее приведенного примера, который более управляем и легок для понимания:

    a = AVISource("d:\capture.00.avi")
    b = AVISource("d:\capture.01.avi")
    c = AVISource("d:\capture.02.avi")
    sound_track = WAVSource("d:\audio.wav")
    AudioDub(a+b+c, sound_track)

## Цвета (Colors)

В некоторых фильтрах (BlankClip, Letterbox, AddBorders и FadeXXX) можно задать аргумент цвета. В любом случае цвет должен задаваться в RGB-формате, даже если цветовой формат входного клипа YUV. Параметр можно задать как в шестнадцатиричном, так и в десятичном представлении. Шестнадцатиричное представление цвета таково: первые две цифры определяют канал красного цвета R, следующие две цифры - канал зеленого цвета G и последние две цифры - канал синего цвета B. Шестнадцатиричное число должно предваряться знаком $. Десятичное представление цвета менее наглядно, так как представляет сумму значения красного канала, умноженного на 65536 (2 в 16-й степени), плюс значение зеленого канала, умноженного на 256 (2 в 8-й степени), плюс значение синего канала.

Приведем пример. Коричневый цвет задается R=$A5 (165), G=$2A (42), B=$2A (42). Таким образом `BlankClip(color=$A52A2A)` выдает коричневый кадр. Конвертирование каждого канала в десятичное цифровое представление (помните, что для него A=10, B=11, C=12, D=14, E=14, F=15) даст

    R = $A5 = 10*16^1 +  5*16^0 = 165
    G = $2A =  2*16^1 + 10*16^0 =  42
    B = $2A =  2*16^1 + 10*16^0 =  42

    165*65536 + 42*256 + 42 = 10824234

Таким образом, для получения коричневого кадра с использованием десятичного представления используется `BlankClip(color=10824234)`.

Заданные определения (пресеты) общеупотребительных цветов моут быть найдены в файле colors_rgb.avsi, который должен присутствовать в вашей папке автозагрузки плагинов (список определений посмотрите в файле). Таким образом `BlankClip(color=color_brown)` даст те же коричневые кадры.

Обратите внимание, что черный RGB=$000000 будет преобразововаться в Y=16, U=V=128, если цветовой формат входного клипа YUV, так как используется цветовая конверсия по умолчанию RGB [0,255] ->YUV [16,235].

## Операторы (Operators)

Для всех типов (clip, int, float, string, bool) переменных, над которыми выполняются операции (операндов) можно выполнить операции:
`==` проверить на равенство (equal)
`!=` проверить на неравенство (not equal)

Для числовых (numeric) типов (int, float):
`+` суммировать (add)
`-` вычесть (subtract)
`*` умножить (multiply)
`/` разделить (divide)
`%` остаток от деления (mod)
`>=` больше или равно (greater or equal than)
`<=` меньше или равно (less or equal than)
`<` меньше (less than)
`>` больше (greater than)

    В предшествующих версиях AviSynth выражения обрабатывались справа налево, что приводило к неожиданным результатам:

     a = 10 - 5 - 5 давало в результате 10 - (5 - 5) = 10 вместо (10 - 5) - 5 = 0 !

     Этот недостаток был исправлен!
     Начиная с версии 2.53 также и умножение и деление обрабатывается слева направо (а не справа налево как ранее).

Для строк (string type):
`+` ``суммировать (add)
`>=` больше или равно (не учитывая различия больших-малых букв)
`<=` меньше или равно (не учитывая различия больших-малых букв)
`<` меньше (не учитывая различия больших-малых букв)
`>` больше (не учитывая различия больших-малых букв)

Для клипов (clip type):

`+` аналогично функции `UnalignedSplice`
`++` аналогично функции `AlignedSplice`

Для логических (bool) (true/false):
`||` логическое ИЛИ (or)
`&&` логическое И (and)
`?:` условное исполнение кода (тернарный оператор языка C)

    b = (a==true) ? 1 : 2

    Это означает (как бы псевдо-BASIC):

    if (a=true) then b=1 else b=2

## Скрипт-функции (Script Functions)

Входные и выходные значения этих функций - не клипы, а некоторые иные переменные, используемые в скрипте.

#### Числовые функции:

`Max(int, int[, ...])` / `Max(float, float[, ...])`: Максимальная величина из набора чисел. | `Max` (1, 2) = 2 `Max` (5, 3.0, 2) = 5.0
`Min(int, int[, ...])` / `Min(float, float[, ...])`: Минимальная величина из набора чисел. | `Min` (1, 2) = 1 `Min` (5, 3.0, 2) = 2.0
`MulDiv(int m, int n, int d)`: (m*n+d/2)/d с 64-битным промежуточным результатом | `MulDiv` (1, 1, 2) = 1 `MulDiv` (2, 3, 2) = 3
`Floor(float)`: преобразует float в int (округление вниз) | `Floor` (1.2) = 1 `Floor` (1.6) = 1 `Floor` (-1.2) = -2 `Floor` (-1.6) = -2
`Ceil` (float): преобразует float в int (округление вверх) | `Ceil` (1.2) = 2 `Ceil` (1.6) = 2 `Ceil` (-1.2) = -1`` `Ceil` (-1.6) = -1
`Round` (float): преобразует float в int (по правилам округления) | `Round` (1.2) = 1 `Round` (1.6) = 2 `Round` (-1.2) = -1 `Round` (-1.6) = -2
`Int` (float): преобразует float в int (округление усечением абсолютного значения - "rounds toward zero"). | `Int` (1.2) = 1 `Int` (1.6) = 1 `Int` (-1.2) = -1 `Int` (-1.6) = -1
`Float` (int): преобразует int в float. | `Float` (1) = 1.0
`Frac` (float): возвращает дробную часть переменной типа float. | `Frac` (3.7) = 0.7 `Frac` (-1.8) = -0.8
`Abs` (integer) / `Abs` (float): абсолютное значение integer или float (возвращает целое для целого, вещественное для вещественного). | `Abs`(6) = 6 `Abs`(-1.8) = 1.8
`Sign` (int) / `Sign` (float): возвращает знак числа (положительное или отрицательное) в виде -1, 0 or 1. | `Sign`(-3.5) = -1 `Sign`(3.5) = 1 `Sign`(0) = 0
`HexValue` (string) возвращает числовое значение шестнадцатеричной строки | `HexValue` ("FF00") = 65280
`Sin` (float) Возвращает значение синуса (аргумент задается в радианах) | Sin(Pi()/4) = 0.707 Sin(Pi()/2) = 1.0
`Cos` (float) Возвращает значение косинуса (аргумент задается в радианах) | Cos(Pi()/4) = 0.707 Cos(Pi()/2) = 0.0
`Pi` () Возвращает число "пи" (константу, получаемую делением длины окружности на его диаметр | d = Pi() # d == 3.141593
`Log` (float) Возвращает натуральный логарифм от аргумента | Log(1) = 0.0 Log(10) = 2.30259
`Exp` (float) Возвращает натуральную экспоненту от аргумента | Exp(1) = 2.718282 Exp(0) = 1.0
`Pow` (float base, float power) Возвращает "base", возведенное в степень "power" | Pow(2, 3) = 8 Pow(3, 2) = 9 Pow(3.45, 1.75) = 8.7334
`Sqrt` (float) Возвращает квадратный корень от аргумента | Sqrt(1) = 1.0 Sqrt(2) = 1.4142
`Rand`([int max] [, bool scale] [, bool seed]): возвращает случайное целое число между 0 и max. по умолчанию: max = 32768 scale = TRUE ( TRUE = normal mode, FALSE = modulus mode) seed = FALSE (TRUE = использовать время для задания начального значения случайного генератора) | `Rand`(100) = целое число между 0 и 99, все числа равновероятны. `Rand`(32767, False) = целое число между 0 и 32766, с 0 в двое более вероятным, чем другие числа.
`Spline` (float X, x1,y1, x2,y2, ...., bool "cubic"} v2.5 Интерполирует значение Y для точки X используя контрольные точки x1/y1,... Необходимы как минимум 2 x/y-пары. Интерполяция может быть кубической (результат - сплайн) или линейной (результат - ломаная) | `Spline` (5, 0,0, 10,10, 20,0, false) = 5 `Spline` (5, 0,0, 10,10, 20,0, true) = 7

#### Строковые функции:

`UCase` (string): возвращает строку в верхнем регистре (большими буквами) | `UCase` ("AviSynth") = "AVISYNTH"
`LCase` (string): возвращает строку в нижнем регистре | `LCase` ("AviSynth") = "avisynth"
`RevStr` (string): возвращает строку в обратном порядке | `RevStr` ("AviSynth") = "htnySivA"
`StrLen` (string): возвращает длину строки | `StrLen` ("AviSynth") = 8
`Findstr` (string1, string2): возвращает позицию строки string2 в составе string1. При поиске учитывается размер букв. | `Findstr` ("AviSynth","syn") = 4
`LeftStr` (string, length) / `RightStr` (string, length): возвращает левую/правую часть строки указанной длины | `LeftStr` ("AviSynth",3) = "Avi"
`MidStr` (string, start [, length]): возвращает часть строки от позиции start (для первого символа start=1) длиной, указанной параметром length или до конца строки (если length не задано). | `MidStr` ("AviSynth",3,2) = "iS"
`VersionNumber` () | `VersionNumber` () = 2.07
`VersionString` () | `VersionString` () = "AviSynth 2.08 (avisynth.org) 22 nov. 2002"
`Chr` (int): возвращает символ с номером int согласно таблицы символов ASCII v2.5 | `Chr` (34) возвращает символ кавычек
`Time` (string): возвращает системное время в виде строки указанного формата v2.5 | Коды выходного формата: %a День недели в сокращенном виде %A День недели - полное имя %b Месяц в сокращенном виде %B полное название Месяца %c Дата и время в местном представлении %d День месяца как десятичное число (01 – 31) %H Час в 24-часовом формате (00 – 23) %I Час в 12-часовом формате (01 – 12) %j Номер дня в году, десятичный (001 – 366) %m Месяц как десятичное число (01 – 12) %M Минуты как десятичное число (00 – 59) %p Индикатор времени суток для 12-часового формата в местном представлении (типа A.M./P.M.) %S Секунды как десятичное число (00 – 59) %U Номер недели в году как десятичное число, из расчета, что начало недели - воскресенье (00 – 53) %w Номер дня недели как десятичное число (0 – 6; воскресенье - это 0) %W Номер недели в году как десятичное число, из расчета, что начало недели - понедельник (00 – 53) %x Дата в местном представлении %X Время в местном представлении %y Год - только последние 2 цифры, как десятичное число (00 – 99) %Y Год полностью, как десятичное число %z, %Z Имя временной зоны, полное или сокращенное; символы отсутствуют, если зона неизвестна %% Знак процента Флаг # может предварять кодовый символ для любого формата. В данном это означает следующее: %#a, %#A, %#b, %#B, %#p, %#X, %#z, %#Z, %#% флаг # игнорируется. %#c Используется длинное местное представление даты и времени. Например: “Вторник, 14 марта, 1995, 12:41:29„. %#x Используется длинное местное представление даты. Например: “Tuesday, March 14, 1995„. %#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#w, %#W, %#y, %#Y Удаляется лидирующий ноль (если он присутствует).

#### Преобразования:

`Value` (string): возвращает значение строки. | `Value` ( "-2.7" ) = -2.7
`String` (float / int / string, format_string): преобразует цифру в строку. Если переменная типа float или int, она приводится к виду float и в соответствии с форматной строкой преобразовывается в строку. Синтаксис форматной строки: %[flags][width][.precision]f width: длина выходной строки (минимальная, строка в любом случае не обрезается) precision: число печатаемых цифр flags: `-` выравнивание по левому краю (обычно выравнивается по правому краю) `+` `отображать` `знаковый символ` +/- `0 проставлять лидирующие ноли` `' '` `отображать` `пробел вместо символа` "+" `# всегда отображать` десятичную точку | Например `Subtitle` ("Высота кадра: " + `String` (last.height) ) `String`(1.23, "%f") = '1.23' `String`(1.23, "%5.1f") = ' 1.2' `String`(1.23, "%1.3f") = '1.230'

#### Функции проверки версии:

`VersionNumber` () Возвращает номер версии AviSynth как float число | `VersionNumber` () = 2.56
`VersionString` () Возвращает информацию о версии AviSynth как строку (первая строка используется в комманде `Version`). | `VersionString` () = "AviSynth 2.56, build:Oct 28 2005 [18:43:54]"

#### Функции проверки (Test functions):

`IsBool(var)` - является логическим
`IsInt(var)` - является целым числом
`IsFloat(var)` - является вещественным числом
`IsString(var)` - является строкой
`IsClip(var)` - является клипом

#### Другие функции:

`Select` (index, item0 [, item1...]) - выбрать: Возвращает значение из множества item, выбираемое по его индексу index (0=item0). Item могут быть любыми переменными или клипами, допустимы даже смешанные ряды.
`Defined` (var) - определено ли: для задания необязательных параметров в функциях, определяемых пользователем.
`Default` (x, d) - по умолчаниию: возвращает значение x, если оно определено (справедливо Defined(x)), иначе - возвращает d.
`Exist` (filename) - существует: возвращает TRUE или FALSE по результату проверки на наличие файла.
`NOP` (): возвращает NULL (ничего). Предназначено главным образом для операций условного выполнения для пунктов, не возвращающих никаких значений, таких как `import`, когда нет желательного (клипа) по условию "else"(:).
`Eval` (string) - вычислить,
`Apply` (func-string, arg,...) - применить: `Eval` ("f(x)") эквивалентно выполнению `f(x)`, что также эквивалентно `Apply` ("f", x)

    Eval можно использовать, например, так:
    settings = "352, 288"
    Eval( "BicubicResize(" + settings + ")" )

`Import`(filename): выполняет содержимое другого файла с avisynth-скриптом (импортирует в место, где вызывается, текст другого скрипта)

Для сообщений об ошибках и перехвата некорректных входных значений в функции, определяемые пользователем, можно использовать:
`Assert`(bool, string error-message)

`Try ... Catch`: это функция, проверяющая, не возникнет ли конкретная ошибка в строках кода после `Try` и передающая управление (при ее возникновении) в блок после `Catch`:

    Try {
      AviSource("file.avi")
    }
    Catch(err_msg) {
       Blackness.Subtitle(err_msg)
    }

## Функции времени исполнения (Runtime Functions)

Имеются Conditional Filters (условные фильтры), которые работают в процессе исполнения скрипта, что позволяет Вам изменять переменные с учетом особенностей конкретного кадра.
Для решения большинства задач необходимо использовать Runtime Functions (функции времени исполнения), которые обрабатывают содержимое клипа и возвращают значение. v2.5

Вот простой пример, вычисляющий среднее значение яркостной составляющей (luma) для каждого кадра и показывающий результат.

    Version()       # генерирует тестовый клип
    ConvertToYV12   # преобразовываем в цветовой формат YV12
    FadeIn(10)      # обеспечиваем изменение яркости (luma) чтобы увидеть изменения

    ScriptClip(" Subtitle(String(AverageLuma())) ")  # выводим субтитры Subtitle(...) для каждого кадра,
             # формируемые с учетом значений, выдаваемых AverageLuma
             # и преобразованных в строку
    ConvertToRgb    # показываем полученный результат в RGB-формате

## Управляющие функции (Control Functions)

`SetMemoryMax` (int): Устанавливает максимальный объем используемой памяти в МегаБайтах (MB). При значении 0 просто возвращает текущее значение Memory Max. v2, (=0) v2.5.8

В серии версий 2.5 по умолчанию значение Memory Max составляет 25% от свободной физической памяти, с минимумом в 16MB. С версии 2.5.8 RC4, значение Memory Max по умолчанию также ограничено 512MB.

Свободная память: | <64 | 128 | 256 | 512 | 1024 | 2048 | 3072
Max по умолчанию в 2.5.7 и ранее: | 16 | 32 | 64 | 128 | 256 | 512 | 768
Max по умолчанию с 2.5.8 RC4: | 16 | 32 | 64 | 128 | 256 | 512 | 512

В некоторых старых версиях значение по умолчанию 5 MB, что весьма мало. Если наблюдаются проблемы (например, низкая скорость), попробуйте установить это значение не менее 32MB (лучше 128). Слишком большие величины могут привести к аварии из-за предела адресного пространства 2 Гбайт.
Возвращаемое значение: действующая установленная величина максимальной памяти.

`SetPlanarLegacyAlignment` (clip, bool): Устанавливает режим выравнивания планарных кадров v2.5.6
Некоторые старые плагины некорректно размещают видеокадры в памяти. Этот специальный фильтр принудительно задает размещение видеокадров в памяти совместимым с более ранними версиями AviSynth образом. Фильтр работает со стеком функции GetFrame(), потому его действие распространяется на фильтры, размещенные в скрипте до него.

    Пример: использование старой версии Mpeg2Source()

    LoadPlugin("...\Mpeg2Decode.dll")
    Mpeg2Source("test.d2v")         # плагин некорректно задает размещение в памяти
    SetPlanarLegacyAlignment(true)  # устанавливаем правильное выравнивание под предыдущие выражения
    ConvertToYUY2()                 # выражения вплоть до конца скрипта имеют современный тип ...
                                    # выравнивания (следовательно для них ничего принудительно менять не надо)

`SetWorkingDir` (string): Устанавливает рабочий каталог Avisynth. v2
Используется для облегчения загрузки исходных клипов и т.п. Не влияет на автозагрузку плагинов. Возвращает 0 при успехе, -1 при неудаче.

`global OPT_AllowFloatAudio=True`: v2.57
Эта опция разрешает аудио выход формата WAVE_FORMAT_IEEE_FLOAT (с плавающей точкой). По умолчанию - автоматически преобразовывать такое Float аудио в 16-бит (целые числа).

`global OPT_UseWaveExtensible=True`: v2.58
Эта опция разрешает WAVE_FORMAT_EXTENSIBLE вывод звука. По умолчанию устанавливается WAVE_FORMAT_EX.

Замечание: DirectShow компонент по умолчанию для .AVS файлов, "AVI/WAV File Source", некорректно реализует обработку WAVE_FORMAT_EXTENSIBLE, и таким образом многие приложения могут быть не способны получить аудио дорожку. Существуют DirectShow считыватели других производителей, которые работают корректно. Промежуточные рабочие файлы, написанные используя AVIFile интерфейс для последующей обработки DirectShow, будут работать корректно, если они используют DirectShow "File Source (async)" компонент или эквивалентный.

## Свойства клипа (Clip Properties)

Следующие функции принимают на вход клип и возвращают его свойства.

`Width` (clip) | Возвращает ширину кадра клипа в пикселах (тип: int).
`Height` (clip) | Возвращает высоту кадра клипа в пикселах (тип: int).
`Framecount` (clip) | Возвращает количество кадров в клипе (тип: int).
`Framerate` (clip) | Возвращает скорость клипа - количество кадров в секунду (тип: float).
`FramerateNumerator` (clip) v2.55 | Числитель частоты кадров (тип: int).
`FramerateDenominator` (clip) v2.55 | Знаменатель частоты кадров (тип: int).
`Audiorate` (clip) | Возвращает частоту выборки звука в клипе.
`Audiolength` (clip) | Возвращает количество выборок звука в клипе (тип: int). Учтите, на слишком длинных клипах возможно переполнение (кол. выборок ограничено 2^31).
`AudiolengthF` (clip) v2.55 | Возвращает количество выборок звука в клипе (тип: float).
`Audiochannels` (clip) | Возвращает количество звуковых каналов в клипе.
`Audiobits` (clip) | Возвращает "битовую глубину" - количество бит квантования звука в клипе.
`IsAudioFloat` (clip) v2.55 | Возвращает true, если "битовая глубина" звука в клипе представлена во float.
`IsAudioInt` (clip) v2.55 | Возвращает true, если "битовая глубина" звука в клипе представлена в integer.
`IsRGB` (clip) | Возвращает true, если клип RGB, иначе false (type: bool).
`IsRGB24` (clip) | Возвращает true, если клип RGB24, иначе false (type: bool).
`IsRGB32` (clip) | Возвращает true, если клип RGB32, иначе false (type: bool).
`IsYUY2` (clip) | Возвращает true, если клип YUY2, иначе false (type: bool).
`IsYV12` (clip) v2.51 | Возвращает true, если клип YV12, иначе false (type: bool).
`IsYUV` (clip) v2.54 | Возвращает true, если клип YUV, иначе false (type: bool).
`IsPlanar` (clip) v2.51 | Возвращает true, если клип имеет планарный цветовой формат (каждая цветовая плоскость в отдельном массиве), иначе false (type: bool).
`IsInterleaved` (clip) v2.51 | Возвращает true, если клип имеет цветовой формат с чередованием цветовых данных для каждого пиксела, иначе false (type: bool).
`IsFieldBased` (clip) | Возвращает true, если клип основан на полях (разделен на поля) (type: bool).
`IsFrameBased` (clip) | Возвращает true, если клип основан на полных кадрах (type: bool).
`GetParity` (clip, int "n") | Возвращает true, если кадр n (по умолчанию 0) является верхним полем (Top Field) клипа, разделенного на поля, или полным кадром с верхним полем первым (TFF) неразделенного на поля клипа (type: bool).
`HasAudio` (clip) v2.56 | Возвращает true, если клип содержит звук, иначе false (type: bool).
`HasVideo` (clip) v2.56 | Возвращает true, если клип содержит видео, иначе false (type: bool).

    Не забывайте: свойства можно использовать также относительно встроенной переменной LAST
    или в варианте ООП-записи:
    BilinearResize(Width/2, Height/2)
       то же, что и
    BilinearResize(Width(Last)/2, Height(Last)/2)
       и то же, что и
    BilinearResize(Last.Width / 2, Last.Height / 2)

## Функции, определяемые пользователем (User-Defined Functions)

Вы можете определить (создать) свою собственную функцию. Лучше объяснить на примере:

    Function NTSC2PAL( clip c) {
        Assert(c.height == 480, "NTSC2PAL: входной клип должен иметь разрешение в 480 строк")
        Bob(c, height=576)
        return Weave()
    }

Возможно даже создать рекурсивную (включающую собственный вызов) функцию.

    function TRANSITION(clip clip, int start, int expo, int overlap)
    {
       return ( start >= clip.framecount-expo ?
    \      Trim(clip,start,0) :
    \      Dissolve(Trim(clip,start,start+expo-1),
    \         TRANSITION(clip,start+expo,expo,overlap),
    \         overlap
    \              )
    \         )
    }

## Функции с более чем одним входным клипом

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

Входные клипы обязательно должны иметь одинаковый цветовой формат и, за исключением Layer - одинаковое разрешение.

| скорость видео | количество кадров | содержимое звука | параметры звука
AlignedSplice, UnalignedSplice | первый клип | сумма всех клипов |  | смотри описание фильтра | из первого клипа
Dissolve | сумма всех клипов за вычетом перекрытий |  | смотри описание фильтра
Merge, MergeLuma, MergeChroma, Merge(A)RGB | как у первого клипа | последний кадр кратчайшего клипа повторяется до конца суммарного клипа | первый клип
Layer
Subtract | как у наиболее длинного клипа
StackHorizontal, StackVertical
Interleave | (к/с из 1-го клипа) x (количество клипов) | N-кратное количество кадров от наиболее длинного клипа

Как Вы видите - функции не полностью симметричны, но принимают часть атрибутов первого клипа.

## Плагины (Plugins)

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

`LoadPlugin` ("filename" [, ...])

Загружает один (или более) плагинов (в виде DLL-модулей).

`LoadVirtualDubPlugin` ("filename", "filtername", preroll)

Эта функция загружает плагины, написанные для VirtualDub. Здесь "filename" - это имя .vdf-файла. После вызова этой функции VirtualDub-фильтры становятся доступными avisynth с именами, заданными параметром "filtername". VirtualDub-фильтры работают только с форматом RGB32. Даже с видео в формате RGB24, необходимо использовать `ConvertToRGB32` (`ConvertToRGB` недостаточно).

Выходные данные некоторых фильтров зависят от содержимого предыдущих кадров; для них необходимо установить опережающую обработку данных как минимум на количество кадров preroll, необходимых для пре-процессинга, чтобы заполнить их буферы и/или отследить актуальные значения их внутренних переменных.

`LoadVFAPIPlugin` ("filename", "filtername")

Функция позволяет использовать плагины VFAPI (импортируемые TMPGEnc плагины).

`LoadCPlugin` ("filename" [, ...])

`Load_Stdcall_Plugin` ("filename" [, ...])

Функции загружает так называемые AviSynth C-плагины (в виде DLL-модулей).

Load_Stdcall_Plugin() - синоним LoadCPlugin(). C-plugins (читать - "Си-плагины") это плагины, созданные на языке C с использованием "Avisynth C API" (в отличие от обычных плагинов созданных на MS VC++). Они должны загружаться с помощью функций LoadCPlugin() или Load_Stdcall_Plugin().
Kevin создал LoadCPlugin.dll для переназначения функции LoadCPlugin() с целью поддержки C-плагинов, скомпилированных с использованием обычного соглашения вызова подпрограмм на Си (cdecl), используйте Load_Stdcall_Plugin() для загрузки C-плагинов со стандартным соглашением вызова (stdcall) в случае использования версии Kevin-а. Советуем избегать размещения таких C-плагинов в директории авто-загрузки плагинов во избежание серьезных проблем. [англоязычное обсуждение] [AVISynth C API (by kevina20723)]

## Авто-загрузка плагинов и приоритет имен (name precedence) v2

Можно размещать все файлы плагинов и скрипт-файлы с функциями, определяемыми пользователем или (глобальными) переменными в директории, откуда все файлы с расширениями .AVSI (v2.08, v2.5, был тип .AVS в версиях v2.05-2.07) и .DLL будут загружаться при старте, динамично выгружаться и вновь загружаться по мере необходимости при работе скрипта.

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

Путь к этой директории сохраняется в системном регистре (место хранения в регистре изменено для v2.5). Двойной клик на .REG-файле следующего содержания позволит задать необходимый путь к нужной директории (конечно, если указан корректный путь):

    REGEDIT4

    [HKEY_LOCAL_MACHINE\SOFTWARE\Avisynth]
    "plugindir2_5"="c:\\program files\\avisynth 2.5\\plugins"

(Указанная папка автоматически создается и регистрируется при установке AviSynth 2.5)

Порядок выполнения функций определяется следующими правилами:

    функции, определяемые пользователем (всегда имеют высший приоритет)
       плагин-функции (имеют более высокий приоритет
       по отношению к встроенным функциям и будут подменять их)
           встроенные функции

В пределах этих групп загрузка функций выполняется в порядке следования (последняя получает преимущество), не генерируются ошибки конфликта имен.

## Автозагрузка плагинов и конфликты имен функций v2.55

Начиная с версии 2.55 поддерживается DLLName_function(). Проблема заключается в возможной загрузке двух плагинов, содержащих функции с одинаковыми названиями. Для загрузки нужной функции из них и предназначена DLLName_function(). Она генерирует автоматически дополнительные имена как для автозагруженных плагинов, так и для плагинов, загруженных функцией LoadPlugin.

Некоторые примеры:

    # использование функции fielddeinterlace из decomb510.dll
    AviSource("D:\captures\jewel.avi")
    decomb510_fielddeinterlace(blend=false)

Предполагается что в каталоге автозагрузки имеются плагины mpeg2dec.dll и mpeg2dec3.dll, и Вы хотите загрузить d2v-файл с помощью mpeg2dec.dll (в выходном формате YUY2):

    # использовать mpeg2source из mpeg2dec.dll
    mpeg2dec_mpeg2source("F:\From_hell\from_hell.d2v")

или с помощью mpeg2dec3.dll (выходной формат которой YV12):

    # использовать mpeg2source из mpeg2dec3.dll
    mpeg2dec3_mpeg2source("F:\From_hell\from_hell.d2v")

`$English Date: 2008/12/06 16:37:26 $
Русский перевод 16.05.2005-23.09.2007 Turyst04 Turyst04@nm.ru
Обновления 20.09.2007-24.12.2008 Fizick`