AviSynth

AviSynth

Показано с 1 по 10 из 12

  1. #1

    AviSynth

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

    AviSynth — свободно распространяемая программа с открытым кодом, предназначенная для обработки видеоматериалов, в частности линейного и нелинейного монтажа.
    Что делает AviSynth уникальным по интерфейсу, так это факт, что он не является самостоятельной программой, имеющей графический интерфейс и производящей выходные файлы. Вместо того, AviSynth действует как «посредник» между видеофайлами и программами обработки видео, то есть как фрейм-сервер (кадр-сервер, податчик кадров).
    Работа происходит следующим образом. Во-первых, вы создаете простой текстовый документ, так называемый скрипт (файл с расширением *.AVS), со специальными командами. Эти команды ссылаются на одно или более входное видео и на фильтры, которые вы хотите к ним применить. Затем вы запускаете видеоприложение (программу), например, VirtualDub, и открываете в нем файл скрипта. Тут начинает действовать AviSynth. Он открывает видеоисточники, на которые вы ссылались в скрипте, применяет указанные фильтры, и посылает результат видеоприложению. Приложение, однако, не знает, что это AviSynth работает в фоне. Вместо этого приложение думает, что оно напрямую открывает некий отфильтрованный AVI-файл, который располагается на вашем жестком диске.

    Благодаря множеству различных плагинов, AviSynth позволяет значительно расширить возможности монтажных программ. Например, при помощи плагина Quicktime Import Filter для AviSynth можно импортировать нужный нам файл Apple Quick Time в любую программу, которая поддерживает импорт файлов AviSynth. При этом абсолютно не важно, поддерживает нужная нам программа формат Apple Quick Time или не поддерживает.
    Разработчики-энтузиасты часто выпускают плагины, которые позволяют импортировать скрипты AviSynth в различные монтажные программы, которые скрипты AviSynth не поддерживают изначально. Примером может служить Adobe Premiere Pro.
    Также может использоваться с VirtualDub, входит в состав Gordian Knot.
    Фреймсервер AviSynth является как бы посредником между физическими медиа-файлами на жёстком диске и монтажной программой. Это позволяет упростить конечный монтаж за счёт предварительно монтажа посредством AviSynth.



    Последний раз редактировалось ASEVI; 29.05.2014 в 19:19.
  2. Поблагодарили:

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

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

    Простейшее, что Вы можете выполнить с помощью 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:
    AVIsynth script:
    1. Version
    2. ReduceBy2
    3. # отрезать первые 119 кадров и сохранить кадры 120-150
    4. # (AviSynth начинает отсчет с кадра 0)
    5. Trim(120,150)
    6. FadeOut(10)

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

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

    На практике гораздо более используемым фильтром нежели Version будет AVISource, считывающий AVI-файл (или один из нескольких других типов файлов) с диска. Если у Вас под рукой есть AVI-файл, Вы можете попробовать использовать те же фильтры на нем:
    AVIsynth script:
    1. AVISource("d:\capture.avi") # проставляется нужный путь к файлу
    2. ReduceBy2
    3. FadeOut(15)
    4. Trim(120,0)

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



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

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

    Один из наиболее используемых фильтров такого типа это UnalignedSplice, который соединяет видео-клипы друг-за-другом. Вот скрипт, который грузит три AVI-файла (которые могут быть созданы AVI_IO) и объединяет их вместе.
    AVIsynth script:
    1. UnalignedSplice(AVISource("d:\capture.00.avi"), \
    2. AVISource("d:\capture.01.avi"), \
    3. AVISource("d:\capture.02.avi"))

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

    К примеру, такой скрипт делает тоже, что и предыдущий:
    AVIsynth script:
    1. AVISource("d:\capture.00.avi") + \
    2. AVISource("d:\capture.01.avi") + \
    3. AVISource("d:\capture.02.avi")

    Давайте теперь предположим, что Вы захватываете видео, используя приложение, которое сохраняет видео в различных AVI сегментах, а звук помещает в отдельном WAV файле. Можем ли мы воссоединить все? Ваш выбор:
    AVIsynth script:
    1. AudioDub(AVISource("d:\capture.00.avi")+ \
    2. AVISource("d:\capture.01.avi")+ \
    3. AVISource("d:\capture.02.avi"), \
    4. WAVSource("d:\audio.wav"))


    Последний раз редактировалось ASEVI; 03.03.2014 в 15:02.
  4. #3
    Синтаксис (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) функциями так же как и основным скриптом.

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

    AVIsynth script:
    1. a = AVISource("d:\capture.00.avi")
    2. b = AVISource("d:\capture.01.avi")
    3. c = AVISource("d:\capture.02.avi")
    4. sound_track = WAVSource("d:\audio.wav")
    5. AudioDub(a+b+c, sound_track)


    Последний раз редактировалось ASEVI; 10.03.2014 в 17:56.
  5. #4
    Цвета (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].


    Последний раз редактировалось ASEVI; 14.03.2014 в 17:11.
  6. #5
    Операторы (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


  7. #6
    Скрипт-функции (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)

    AVIsynth script:
    1. Try ... Catch: это функция, проверяющая, не возникнет ли конкретная ошибка в строках кода после Try и передающая управление (при ее возникновении) в блок после Catch:
    2. Try {
    3. AviSource("file.avi")
    4. }
    5. Catch(err_msg) {
    6. Blackness.Subtitle(err_msg)
    7. }


    Последний раз редактировалось ASEVI; 14.03.2014 в 17:05.
  8. #7
    Функции времени исполнения (Runtime Functions)

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

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

    AVIsynth script:
    1. Version() # генерирует тестовый клип
    2. ConvertToYV12 # преобразовываем в цветовой формат YV12
    3. FadeIn(10) # обеспечиваем изменение яркости (luma) чтобы увидеть изменения
    4.  
    5. ScriptClip(" Subtitle(String(AverageLuma())) ") # выводим субтитры Subtitle(...) для каждого кадра,
    6. # формируемые с учетом значений, выдаваемых AverageLuma
    7. # и преобразованных в строку
    8. ConvertToRgb # показываем полученный результат в RGB-формате


  9. Поблагодарил:

     photik
  10. #8
    Управляющие функции (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()
    AVIsynth script:
    1. LoadPlugin("...\Mpeg2Decode.dll")
    2. Mpeg2Source("test.d2v") # плагин некорректно задает размещение в памяти
    3. SetPlanarLegacyAlignment(true) # устанавливаем правильное выравнивание под предыдущие выражения
    4. ConvertToYUY2() # выражения вплоть до конца скрипта имеют современный тип ...
    5. # выравнивания (следовательно для них ничего принудительно менять не надо)



    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)" компонент или эквивалентный.


  11. #9
    что надо сделать для автоматического наложения одного видеоклипа (допустим Blu-ray 2.39:1) на другой (Open Matte 1.78:1) с помощью AviSynth


  12. #10
    @koren, Надо написать скрипт наложения, который будет фильтром наложения и открыть его в программе кодера, который вы выберите.


Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

-->