AviSynth: сложно о простом

Работа с чересстрочным видео

В прошлый раз (№1, 2007) мы говорили с вами об открытии источников... Итак, источник мы открыли. Что дальше? Конечно, все зависит от того, что мы хотим получить на выходе. Но будут и некоторые операции, без которых не обойтись. В случае, если обрабатываемое вами видео получено при захвате с ТВ-тюнера, видеокамеры или с некоторых DVD, оно будет чересстрочным. О структуре чересстрочного видео мы говорили в статьях по захвату видео с ТВ-тюнера. Если вам нужно перенести такое видео на компьютер, скорее всего, придется преобразовать его в прогрессивный формат. AviSynth представляет для этого множество возможностей, обеспечиваемых как встроенными фильтрами, так и внешними.

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

Пример:

AVISource("G:\test\1.avi") # открываем видеофайл
SeparateFields() # разделяем видео на поля
 

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

Для объединения четных и нечетных полей после обработки функцией SeparateFields существует встроенная функция Weave. Иными словами, данная функция выполняет действие, противоположное SeparateFields. Обе эти функции применяются в одном скрипте с целью передачи чересстрочного видео, разделенного на поля фильтрами, которые либо не поддерживают работу с таким видео, либо нам по какой-то причине требуется обработать поля отдельно. Например, при шумоподавлении такой подход иногда оказывается очень эффективным.

Пример:

LoadPlugin("C:\Program Files\Avisynth\Plugins\DeGrainMedian.dll")
 # загружаем плагин
AviSource("G:\test\1.avi"") # открываем видеофайл
SeparateFields() # разделяем видео на поля
DeGrainMedian() # фильтруем каждое поле по-отдельности
Weave() # соединяем поля в кадры

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

Пример:

LoadPlugin("C:\Program Files\Avisynth\Plugins\DeGrainMedian.dll")
 # загружаем плагин
AviSource("G:\test\1.avi") # открываем видеофайл
SeparateFields() # разделяем видеокадры на поля
Even = SelectEven() # выделяем четные (0,2,4...) поля в переменную Even
Even = DeGrainMedian(Even) # фильтруем четные поля и замещаем результатом
Odd = SelectOdd() # выделяем нечетные (1,3,5,...) поля в переменную Odd
Odd = DeGrainMedian(odd) # фильтруем четные поля и замещаем результатом
Interleave(even, odd) # чередуем четные и нечетные поля,
# собирая исходную последовательность (0,1,2,3,4,5...)
Weave() # соединяем поля в кадры

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

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

(Продолжение следует)

Андрей АЧИНОВИЧ,
minhex@gmail.com

Версия для печатиВерсия для печати

Номер: 

03 за 2007 год

Рубрика: 

Multimedia
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!