Работа с чересстрочным видео
В прошлый раз (№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
Горячие темы