AviSynth — это программа фрейм-сервера для Microsoft Windows , Linux и macOS, изначально разработанная Беном Рудиаком-Гулдом, Эдвином ван Эггеленом, Клаусом Постом, Ричардом Бергом и Яном Брэбхэмом в мае 2000 года [1] , а затем подхваченная и поддерживаемая сообществом открытого исходного кода, которое действует и по сей день. Это свободное программное обеспечение, лицензированное в соответствии с GNU General Public License .
AviSynth действует как нелинейный видеоредактор, полностью управляемый скриптами (без графического интерфейса пользователя ). [2] Он эмулирует видеофайл AVI (или аудиофайл WAV ), как его видит нисходящее приложение VFW , которое обычно представляет собой медиаплеер , программное обеспечение для редактирования видео или кодер . [3]
AviSynth построен на фильтрах , которые во многом похожи на фильтры DirectShow , но с другим двоичным интерфейсом . Возможности фильтров включают обрезку , деинтерлейсинг , обратный телесин , работу с неподвижными изображениями , выполнение базовой цветокоррекции , снижение видеошума и многое другое. AviSynth также выполняет традиционные задачи редактирования видео, такие как резка, обрезка и повторное упорядочивание сегментов.
Например, рассмотрим скрипт «myAvi.avs» (простой текстовый файл, сохраненный с расширением «avs»).
Источник Avi("myAvi.avi") Обрезать(0, 0, 320, 240) Размытие(0.1)
Этот файл скрипта можно открыть в большинстве медиаплееров (например, Windows Media Player ). Программа воспроизведет видеофайл "myAvi.avi", обрезанный до верхнего левого угла 320 пикселей на 240 пикселей и размытый на небольшую величину. Операции выполняются последовательно, поэтому сначала происходит обрезка, затем размытие.
Технически AviSynth создает граф фильтров (подобный Microsoft GraphEdit, но с дополнительными возможностями), [4] управляемый скриптами, написанными на языке скриптов AviSynth. Его функциональность может быть расширена за счет использования сторонних фильтров, известных как плагины . Список внешних плагинов поддерживается в AviSynth Filter Collection.
AviSynth — это фрейм-сервер — вызывающая программа запрашивает аудио/видео кадры, а скрипт обслуживает их. Вызывающая программа может вызывать кадры в любом порядке, что позволяет ей делать паузу, переходить вперед или назад и т. д., как и в случае с физическим файлом.
Язык сценариев — это язык потока данных : [4] парадигма программирования , описывающая направленный граф данных, протекающих между операциями. В нем отсутствуют некоторые структуры управления процедурным программированием , [5] но он содержит много функций, знакомых программистам, включая переменные , различные типы данных , условные операторы и сложные выражения .
Язык работает в основном с аудио/видеоклипами как со встроенным типом данных. Клип — это сложная структура со множеством атрибутов, таких как ширина, высота и длительность. [6] В языке также есть несколько других более стандартных типов данных: int , float , bool и string . [7] Их можно использовать для выполнения вычислений, принятия решений и написания текста, например субтитров к видео.
Скрипт имеет единственное возвращаемое значение , которое представляет собой аудио и видео, «видимые» программой, выполняющей скрипт. Обычно это последняя строка скрипта, но оператор возврата может быть вставлен в любой момент.
Этот пример представляет собой программу «Hello World» .
BlankClip() Подзаголовок("Привет, мир!")
Если указанный выше текст ввести в текстовый файл с расширением .avs, его можно открыть в проигрывателе Windows Media или любой другой программе из списка ниже, и будет отображено видео, содержащее слова «Hello, world!».
Функция BlankClip создает новое видео. Скобки в конце слова необязательны, поскольку аргументы не передаются, но в данном случае они указаны для указания на функцию, а не переменную.
Функция «Субтитры» рисует слова «Привет, мир!» поверх ранее созданного пустого видео.
Хотя обе функции принимают гораздо больше аргументов (например, управление размером и продолжительностью пустого видео, а также позиционированием, шрифтом и цветом субтитров), в этом примере они не учитываются; функции используют встроенные аргументы по умолчанию.
Avisynth использует синтаксический сахар , который значительно упрощает написание простых скриптов: неявная переменная Last . Без неявных переменных приведенный выше скрипт пришлось бы записать так:
Последний = BlankClip() Last = Last.Subtitle("Привет, мир!") вернуться Последний
или так:
A = BlankClip() B = A.Subtitle("Привет, мир!") возвращение B
Явные переменные клипа обычно используются только для функций, включающих более одного клипа:
A = BlankClip() B = A.Subtitle("Привет, мир!") return Dissolve(A, B, 30) # 30-кадровый кроссфейд
В этом примере берется реальное видео, к нему применяется простая обработка, и оно возвращается на выход.
AviSource("C:\Example.avi") УменьшитьНа2() Оттенки серого()
Функция AviSource используется для загрузки видео AVI из реального местоположения. Для открытия других типов медиа можно использовать функцию DirectShowSource . ReduceBy2 делит вертикальный и горизонтальный размер видео пополам, а GreyScale удаляет всю цветовую информацию.
Фильтры AviSynth работают во многих цветовых пространствах RGB и YUV , чтобы обеспечить все виды ввода и вывода видео. [8] Некоторые функции работают только в определенных цветовых пространствах , требуя преобразования — например, большинство видео распространяется в цветовом пространстве YUV , но большая часть цветокоррекции выполняется в одном из пространств RGB . Скрипт цветокоррекции может выглядеть следующим образом:
DirectShowSource("movie.mp4") # Цветовое пространство YV12 Конвертировать в RGB32 RGBAdjust(1.0, 0.95, 1.0) # уменьшить зеленый канал Конвертировать в YV12
Язык сценариев AviSynth позволяет пользователям определять собственные функции.
Это пример функции, которая позволяет переходить от одного клипа к другому, не повреждая чередующиеся линии.
клип1 = AVISource("видео1.avi") clip2 = AVISource("video2.avi") # вызов пользовательской функции, которая определена ниже: interlaced_dissolve(клип1, клип2, 30) # ...скрипт возвращает указанный выше результат вызывающей программе # определяемая пользователем функция: # растворение от клипа 1 до клипа 2 в течение 30 кадров функция interlaced_dissolve(клип клип1, клип клип2, int iter) { клип1 = клип1.ОтдельныеПоля evn1 = clip1.ВыбратьЧетный odd1 = clip1.ВыбратьOdd клип2 = клип2.ОтдельныеПоля evn2 = clip2.ВыбратьЧетный odd2 = clip2.ВыбратьOdd evn = Растворить (evn1, evn2, итер) нечетный = Растворение(нечетный1, нечетный2, итер) Interleave(evn, odd).Weave.DoubleWeave.SelectOdd # ...функция возвращает указанный выше результат в основной скрипт}
AviSynth 3.0 был полностью переписанным AviSynth 2.x и был нацелен на преодоление ограничений AviSynth 2.x. Добавление улучшений, таких как абстрактная модель цветового пространства , в которой новые цветовые пространства (включая два с глубиной 45 бит) могли поддерживаться через механизм подключаемых модулей, улучшенное управление кэшем для лучшей производительности и использование Ruby вместо доморощенного языка, используемого в текущих версиях. [9]
AviSynth 3.0 должен был быть доступен для других операционных систем, кроме Windows , вместо этого полагаясь на GStreamer , расширяя поддержку таких платформ, как Linux , Mac OS X и BSD . Разработка была остановлена с августа 2007 года. [9] [10]
AviSynth+ — это ответвление официального AviSynth 2.xx, в котором реализованы долгожданные функции, такие как поддержка 64-битной архитектуры , многопоточность , глубокие цветовые пространства , поддержка последних компиляторов, новые конструкции сценариев (новые конструкции потока управления, такие как циклы) и повышенная производительность во многих областях. [11] В то же время он сохранил 100% совместимость с серией AviSynth 2.5/2.6 как для фильтров, так и для хост-приложений. На момент написания статьи (2023-06) он также активно поддерживается.
AviSynth 2.xx может использоваться в операционных системах, отличных от Windows, с помощью Wine . Для работы со скриптами VirtualDub / VirtualDubMod можно использовать как в Windows. Для взаимодействия между AviSynth под Wine и, например, FFmpeg , работающим на хосте Linux, можно использовать Avs2YUV. Avs2YUV — это программа командной строки Windows , которая запускается под Wine и выводит вывод скрипта AviSynth в stdout , который затем передается в FFmpeg. Avs2YUV также поддерживает запись в именованный канал . [12]
Существует порт AviSynth для Linux, который называется AvxSynth. [13]
Кроме того, в настоящее время создано несколько программ, которые принимают в качестве входных данных только скрипты AviSynth, что упрощает сами программы, но при этом предоставляет пользователям все возможности AviSynth для ввода данных.
Также существует несколько приложений пакетного кодирования, которые связывают AviSynth с аудио- и видеокодерами командной строки и мультиплексорами, чтобы обеспечить комплексное, модульное, настраиваемое приложение для кодирования видео. MeGUI является примером такого рода приложений.
Хотя скрипты AviSynth предназначены для легкого открытия в простых программах для редактирования текста, существует несколько редакторов, специально предназначенных для редактирования скриптов AviSynth, например AvsPMod.