Показать сообщение отдельно
Старый 30.07.2008, 15:05   #8
Polad
ВИП
Медаль пользователю. ЗОЛОТО Любитель
Аватар для Polad
Регистрация: 30.03.2007
Адрес: Тридевятое царство
Сообщения: 267
Репутация: 42
8. Преобразование цветовых форматов

В отличие от большинства программ, ведущих обработку в трех цветовых каналах RGB (красный, зеленый, синий), AviSynth может обрабатывать видео в цветовом пространстве YUV (яркость Y и две цветоразности, цветности U и V), в которых обычно ведется вещание и хранится сжатое видео. Эти форматы хранения видео обычно сокращенные (прореженные) для цветности. В формате YUY2 цветность прорежена в два раза по горизонтали, а в формате YV12 (используемом в DVD) — и по вертикали. Желательно обходиться без преобразования цветового формата, но иногда это невозможно из-за несовпадения требуемого выходного формата с входным, или ограничений некоторого конкретного фильтра, в котором автором не реализована поддержка какого-то формата.
При подаче выходных кадров для кодировки в TMPGenc необходим формат RGB, как и при подключении в Avisynth плагинов от VirtualDub (такая возможность имеется), а в Canopus Procoder лучше подавать YUY2.
В AviSynth встроены все необходимые функции для преобразования (конвертации), с именами типа ConvertToXXX, где XXX — это требуемый формат (RGB, YUY2, YV12).
Обработка производится быстрее в сокращенных форматах (меньше объем данных), особенно для YV12, в котором данные по каждой цветовой плоскости хранится в отдельном массиве памяти (планарно). Рассмотрим пример, когда некоторый фильтр работает только в YV12 (это типично для новых плагинов), а источник типа YUY2.
#Пример скрипта 8.1
# Преобразование цветового формата
LoadPlugin("RemoveGrain.dll") # загрузим плагин заранее
AviSource("d:videofilm.avi") # аналоговое видео YUY2
AssumeTFF() # сообщим порядок полей — верхнее поле первое
# Преобразуем клип в цветовой формат YV12
ConvertToYV12(interlaced=true) # опция для чересстрочного
SeparateFields() # разделяем на поля
RemoveGrain(mode=17) # функция работает только в YV12
Weave() # собираем поля
В данном примере мы использовали для иллюстрации плагин RemoveGrain (разработчик Rainer Wittmann "Kassandro") — удалитель зерна (пространственный шумоподавитель) в одном из его многочисленных режимов.
В скрипте следует обратить внимание на то, что команда преобразования формата ConvertToYV12 использована с параметром interlaced=true, это необходимо для правильного преобразования, если видео — чересстрочное. Еще следует обратить внимание, что преобразование цветового формата в скрипте производится с полнокадровым видео, до разделения видео на поля, то есть не рекомендуется преобразовывать цветовой формат разделенного на поля видео, иначе результат будет неверен (немного искажены цвета).
Еще следует иметь в виду, что AviSynth при преобразовании из RGB в YUV по умолчанию сжимает диапазон яркостей (а при обратном — расширяет). Позволю напомнить, что хоть диапазон, хранимый в байте, может быть от 0 до 255, и это нормальный диапазон для формата RGB, то для формата YUV ситуация другая. В телевидении допустимыми (рекомендуемыми) значениями являются от 16 до 235 для яркости и от 16 до 240 для цветности. Поэтому, строго говоря, яркость не должна выходить за эти безопасные пределы (ниже "уровня черного" и выше "уровня белого"), они должны быть обрезаны (параметр coring некоторых фильтров). Однако в компьютерах такие значения часто реализуются и нормально отображаются, как и в телевидении высокого разрешения HDTV. При необходимости можно произвести коррекцию, и использовать параметр matrix для выбора матрицы и диапазона преобразования.