ConvertToRGB / ConvertToRGB24 / ConvertToRGB32
ConvertToYUY2 / ConvertBackToYUY2 / ConvertToYV12

ConvertToRGB (clip [, string "matrix"] [, bool "interlaced"])
ConvertToRGB24 (clip [, string "matrix"] [, bool "interlaced"])
ConvertToRGB32 (clip [, string "matrix"] [, bool "interlaced"])
ConvertToYUY2 (clip [, string "matrix"] [, bool "interlaced"])
ConvertToYV12 (clip [, string "matrix"] [, bool "interlaced"])
ConvertBackToYUY2 (clip [, string "matrix"])

matrix: По умолчанию "Rec601". Управляет цветовыми и масштабирующими коэффициентами, используемых при RGB - YUV преобразованиях.

interlaced: По умолчанию false. Используется чересстрочный алгоритм для YV12 - YUY2/RGB преобразований информации о цвете.

AviSynth до v2.50 мог работать внутренне только с двумя цветовыми форматами, RGB и YUY2. Начиная с v2.50 AviSynth может также работать с третьим цветовым форматом, YV12. Эти фильтры осуществляют преобразование между форматами. Если видео уже в указанном формате, то оно проследует через фильтр без изменений. RGB в данном документе подразумевается RGBA = RGB32. ConvertToRGB конвертирует в RGB32, если только входной клип не RGB24. Если необходим RGB24 по какой-то причине, то необходимо использовать ConvertToRGB24 и для обратного преобразования ConvertToRGB32.

Синтакс и работа ConvertToRGB24 идентична ConvertToRGB, за исключением что выходной формат 24-битный; если исходник RGB32, то альфа-канал будет удален.

С v2.51/v2.52 добавлен опциональный параметр interlaced (по умолчанию interlaced=false). Когда он установле в false, подразумевается, что clip прогрессивный, когда он установле в true, подразумевается, что clip чересстрочный. Эта опция добавлена из-за того, что например (предполагая, что clip чересстрочный в формате YV12):

SeparateFields(clip)
ConvertToYV12
Weave
обрабатывается некорректно. Вместо этого лучше использовать:
ConvertToYV12(clip, interlaced=true)
Необходимо отметить, что установка interlaced=true изменяет что либо, только если требуется преобразование YV12 <-> YUY2/RGB, в остальных случаях просто игнорируется. Больше информации про это можно найти здесь "Цветовые преобразования и чересстрочное / основанное на полях видео".

В отличие от того, что некоторые могут предположить, однозначного преобразования YUV в RGB нет. В AviSynth'е реализованы два наиболее популярных: Rec.601 и Rec.709 (рекомендации ITU-R, названные по их официальным спецификациям). Хотя они не будут правильными во всех случаях, следующее должно быть правильно в большинстве случаев:

Первый вариант (Rec.601) должен быть использован если исходник DivX/XviD или некоторая запись с аналогового источника:

ConvertToRGB(clip)

Второй вариант (Rec.709) должен быть использован если исходник DVD или HDTV:

ConvertToRGB(clip, matrix="rec709")

В v2.56, также доступно обратное этому преобразование -

ConvertToYUY2(clip, matrix="rec709") или ConvertToYV12(clip, matrix="rec709")

В v2.56, matrix="pc.601" (и matrix="pc.709") разрешает производить RGB <-> YUV преобразование сохраняя диапазон сигнала яркости, т.е. RGB [0,255] <-> YUV [0,255] вместо обычного/умолчательного RGB [0,255] <-> YUV [16,235]).

Все фильтры от VirtualDub (загруженные с помощью LoadVirtualdubPlugin, см Plugins) поддерживают только RGB32 на входе.

RGB24, RGB32: Цвета хранятся в значениях основных цветов красного, зеленого и синего. В RGB32 есть дополнительный Альфа канал для прозрачности. Размер изображения может быть любым.

YUY2: Изображение хранится в виде значений яркости Y и двух значений цвета U и V. Для двух горизонтальных пикселов есть только одно значение цвета и два значения яркости (два Y, один U, один V). Поэтому ширина должна быть кратна двум.

YV12: Так же как для YUY2, но только одно значение цвета для 4 пикселов (квадрата 2х2). Оба размера изображения должны быть кратны двум, а если видео чересстрочное, то высота должна быть кратна четырем, потому что квадрат 2х2 берется из поля, а не кадра.

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

Работа с YUY2 быстрее, чем с RGB. YV12 еще быстрее и родное для MPEG формата, так что производится меньше преобразований цветовых пространств.

Преобразования цветовых форматов не беспотерьные, так что надо использовать как можно меньше преобразований. Если множественные преобразования необходимы, надо использовать ConvertBackToYUY2 для преобразования в YUY2, если исходник уже один раз был в формате YUY2. Это уменьшает размазывание цвета, но все еще теряется некоторая часть точности.

В большинстве случаев, фильтр ConvertToRGB не потребуется. Если выход AviSynth в YUY2 и приложение ожидает RGB, система будет использовать установленный YUY2 кодек для производства преобразования. Однако, если установленного YUY2 кодека нету, или если (как в случае ATI и некоторых других YUY2 кодеков) кодек конвертирует из YUY2 в RGB неправильно, можно использовать встроенный фильтр AviSynthа для производства преобразования вместо дополнительных кодеков.

Huffyuv будет работать как системный YUY2 кодек, если больше ни одного кодека для этого формата не установлено, так что если установлен Huffyuv и удалены все другие YUY2 кодеки, то ConvertToRGB никогда не понадобится.

ConvertToRGB24 и ConvertToRGB32 могут быть использованы для форсирования AviSynth к использованию специфического метода хранения RGB данных. RGB24 данные обычно намного медленнее для обработки, чем RGB32, так что если исходник в RGB24, то можно получить прибавку в скорости преобразованием в RGB32. Нету никаких известных преимуществ использования формата RGB24 за исключением того, что TMPGEnc и VFApi требуют RGB24 на входе.

# При преобразовании между YUV И RGB происходит небольшое искажение.
# Посмотрим, можно ли его увидеть.
control = ConvertToYUY2()
test = ConvertToYUY2(ConvertToRGB(ConvertToYUY2(ConvertToRGB(control))))
test = ConvertToYUY2(ConvertToRGB(test))
return Subtract(test,control)

$English Date: 2006/09/27 18:41:25 $
Русский перевод 10.05.2005 Drakon Rider drakan.ru