Глава 3-я (чёрт знает что).
Редактируем AVS-файл.


В этой главе мы будем несколько раз редактировать AVS-файл, сохранять его и проверять результат в VirtualDub'е. Поэтому лучше держать одновременно открытыми редактор и VirtualDub.

3.1 AVS-файл - это обычный текстовый файл, который является управляющим скриптом для программы AviSynth и выполняется сверху вниз, строчка за строчкой. Для этого AviSynth не надо запускать, он работает сервером кадров. То есть любая программа, работающая с видео (например, Media Player или VirtualDub), обретает способность открывать AVS-файлы и получать видеоизображение как результат выполнения скрипта AviSynth'ом.
Общий вид AVS-файла должен быть таким:
Код
Загрузка плагинов (DLL-модулей) (например, LoadPlugin...)
Загрузка видео-файла (например, mpeg2source, AviSource, DirectShowSource)
Де-интерлейсинг (см. п. 3.5)
Обрезание чёрных полей (команда crop)
Удаление шумов (см. п. 3.6)
Коррекция яркости/цвета (см. п. 3.7)
Масштабирование (например, BicubicResize, BilinearResize, ...)

Разумеется, что наличие каждой из этих частей необязательно.
Ниже я буду приводить примеры строк с кодом, которые можно прямо копировать из этого руководства и вставлять в ваш AVS-файл.

3.2 Запускаем свой любимый редактор текстов и открываем AVS-файл, который сделал нам GordianKnot. Из того, что там написано, нам нужны только вот эти 3 строки:
Код
mpeg2source("E:\Rips\MY_MOVIE.D2V")
crop(2,2,716,572)
BicubicResize(716,528)

А всё остальное нужно удалить.
Да-да, вся эта канитель с GordianKnot'ом была из-за этих несчастных шести чисел. smail.gif
В строке с BicubicResize можно удалить 3-й и 4-й параметры, чтобы осталось только 2 числа, как показано в примере выше.

3.3 Если в п. 2.4 вы решили, что верхний или нижний край должен быть обрезан на нечётное число пикселей, то исправить это можно сейчас. Например:
Код
mpeg2source("E:\Rips\MY_MOVIE.D2V")
ConvertToYUY2()
crop(2,3,716,571)
BicubicResize(716,528)


3.4 Запускаем VirtualDub и открываем в нём наш AVS-файл. Двигаем ползунок внизу и проверяем качество картинки.
Если кадры чересстрочные, то нужно обязательно восстановить прогрессивную картинку одним из способов, описанных в п. 3.5.
Если видео не выглядит чересстрочным, то п. 3.5 можно пропустить.


3.5 Восстановление прогрессивного изображения в случае чересстрочной картинки (так называемый де-интерлейсинг, см. также словарь в конце).
Чересстрочное изображение выглядит как двоение объектов во время движения. При этом каждый из таких "призраков" выглядит как бы состоящим только из чётных или только из нечётных строк (так называемый эффект "расчёски"). Оказывается, что в большинстве случаев можно легко совместить эти два "призрака", причём "расчёска" эта исчезнет сама собой.
Решение сводится просто к добавлению нескольких строк в наш AVS-файл.
Ниже приведены возможные варианты того, как выглядит движущийся объект на видео в разных форматах. На каждом рисунке слева показана анимация движения, которая также развёрнута по кадрам.

3.5.1

Рис. 9. Оригинальное прогрессивное изображение (так же выглядят ~70% PAL дисков).
В этом случае никаких дополнительных строк не требуется и можно переходить к п. 3.6.

3.5.2

Рис. 10. Чересстрочное изображение на PAL ДВД, где источником был фильм (~20% дисков).
Этот случай также не представляет большой проблемы.
а) Самое простое решение:
Код
SeparateFields()
Trim(1,0)
Weave()

После этого желательно проверить результат в VirtualDub'е.
б) Если в некоторых эпизодах по-прежнему встречаются чересстрочные кадры, то нужно заменить эти три строки вверху на две такие:
Код
AssumeTFF()
Telecide(guide=2,post=0)

или такие:
Код
AssumeBFF()
Telecide(guide=2,post=0)

в) В редких случаях могут по-прежнему встречаться чересстрочные кадры. Тогда нужно заменить post=0 на post=2.

3.5.3

Рис. 11. Изображение на NTSC ДВД, где источником был фильм (~90% NTSC дисков). Так называемое telecined видео. В этом случае нужно выполнить IVTC (Inverse Tele-сine) конверсию:
a) Простой способ:
Код
AssumeTFF()
Telecide(guide=1,post=0)
Decimate(cycle=5)

или
Код
AssumeBFF()
Telecide(guide=1,post=0)
Decimate(cycle=5)

б) В редких случаях могут по-прежнему встречаться чересстрочные кадры. Тогда нужно заменить post=0 на post=2.

3.5.4

Рис. 12. Чересстрочное изображение на PAL или NTSC ДВД, где источником было видео, ТВ шоу и т. п. (~8% дисков).
В этом случае обычно применяют фильтры, чтобы убрать (или сгладить) артефакты в виде "расчёски". В идеале, на самом деле, нужно скомпенсировать смещение объектов в одном поле относительно другого, так чтобы картинку можно было совместить. Один из таких фильтров - это AlparySoft Deinterlace.
Дело в том, что данная версия фильтра некорректно обрабатывает ширину кадра 720, поэтому мы добавим 16 пикселей к правому краю кадра. Потом эти 16 пикселей будут всё равно обрезаны командой crop.
В итоге наш скрипт будет выглядеть примерно так:
Код
mpeg2source("E:\Rips\MY_MOVIE.D2V")
AddBorders(0,0,16,0 )
AlparySoftDeinterlace(4,32)
crop(2,2,716,572)
...


3.5.5

Рис. 13. Нестандартный или неправильно сконвертированный чересстрочный материал (~2% дисков).
В этом случае идеальное восстановление прогрессивной картинки невозможно. В некоторой степени можно улучшить картинку, используя фильтр AlparySoft Deinterlace, как написано в п. 3.5.4.

3.6 Очистка от шумов. (Обновлено 30 декабря 2008)
Шум составляет значительную часть цифровой информации, и при кодировании это, естественно, требует повышенного битрейта. В случае ДВД, где битрейт может достигать 8000 kbps и выше, шумы практически не влияют на качество самого видео материала. Однако при кодировании в MPEG-4 с битрейтом порядка 2000 kbps, шумы отбирают на себя уже значительную часть битрейта. В итоге для полезного материала битрейт становится недостаточным, и наблюдаются артефакты видеокомпрессии.
Самый распространённый вид шумов, если фильм снимался на киноплёнку - это так называемое зерно плёнки. Именно этот вид шума будет для нас объектом фильтрования.
Если фильм снимался видеокамерой, то шум в основном проявляется как неоднородность в цветовых каналах. Это требует других фильтров.
Если на изображении присутствуют дефекты старой плёнки (мусор, царапины, пятна), то это требует специальных способов очистки.


Мы будем использовать фильтр MVTools для очистки изображения от зерна плёнки.

3.6.1 В случае не очень сильного шума можно использовать вот такой вариант:
Код
super = MSuper(pel=2, sharp=0, chroma=true)

b_vec2 = MAnalyse(super, isb = true,  delta = 2, chroma=true, blksize=8, overlap=4)
b_vec1 = MAnalyse(super, isb = true,  delta = 1, chroma=true, blksize=8, overlap=4)
f_vec1 = MAnalyse(super, isb = false, delta = 1, chroma=true, blksize=8, overlap=4)
f_vec2 = MAnalyse(super, isb = false, delta = 2, chroma=true, blksize=8, overlap=4)

MDegrain2(super,b_vec1,f_vec1,b_vec2,f_vec2,plane=4,thsad=400)

При выборе компромисса скорость/точность параметры blksize и overlap можно выставлять так:
blksize=8 overlap=0 - быстро, но наименее точно
blksize=8 overlap=2 - медленнее, но точнее
blksize=8 overlap=4 - медленно, но довольно точно (оптимально)
blksize=4 overlap=0 - ещё медленнее
blksize=4 overlap=2 - очень медленно. Имеет смысл только в особых случаях.

3.6.2 В случае чёрно-белого фильма, чтобы немного ускорить обработку, можно поменять значения параметров вот так:
chroma=false (в пяти строках)
и
plane=0
(в одной строке)

3.6.3 В случае довольно высокого шума можно использовать вот такой вариант:
Код
super = MSuper(pel=2, sharp=0, chroma=true)

b_vec3 = MAnalyse(super, isb = true,  delta = 3, chroma=true, blksize=8, overlap=4)
b_vec2 = MAnalyse(super, isb = true,  delta = 2, chroma=true, blksize=8, overlap=4)
b_vec1 = MAnalyse(super, isb = true,  delta = 1, chroma=true, blksize=8, overlap=4)
f_vec1 = MAnalyse(super, isb = false, delta = 1, chroma=true, blksize=8, overlap=4)
f_vec2 = MAnalyse(super, isb = false, delta = 2, chroma=true, blksize=8, overlap=4)
f_vec3 = MAnalyse(super, isb = false, delta = 3, chroma=true, blksize=8, overlap=4)

MDegrain3(super,b_vec1,f_vec1,b_vec2,f_vec2,b_vec3,f_vec3,plane=4,thsad=400)

В случае очень низкого шума (картинка уже выглядит гладкой) можно использовать вот такой вариант:
Код
super = MSuper(pel=2, sharp=0, chroma=true)

b_vec1 = MAnalyse(super, isb = true,  delta = 1, chroma=true, blksize=8, overlap=4)
f_vec1 = MAnalyse(super, isb = false, delta = 1, chroma=true, blksize=8, overlap=4)

MDegrain1(super,b_vec1,f_vec1,plane=4,thsad=400)


3.6.4 В приведённых выше примерах можно менять параметр thsad в пределах от 400 до 600. Большие значения приводят к чуть большему подавлению зерна плёнки. Число выше 600 ставить не рекомендуется, поскольку возможно появление следов от движущихся объектов в условиях низкого контраста.

3.7 Коррекция яркости и цветового баланса.
Если вы считаете, что с яркостью и цветом у вас нет проблем, то переходите к п. 3.8.

3.7.1 Коррекция яркости и контраста.
Поскольку в AviSynth нет возможности проверять результат визуально, то мы будем использовать встроенный фильтр levels в программе VirtualDub.
Ставим в меню Video -> Full processing mode, потом выбираем Video -> Filters.
Нажимаем кнопку Add...
В списке слева выбираем levels (internal) и нажимаем OK.
Нажимаем кнопку (1) Show preview.

Рис. 14.

Рис. 15.
Теперь в окне Filter preview двигаем ползунок внизу и выбираем сцены с тёмными и c яркими областями. На каждой сцене нажимаем в первом окне кнопку (2) Sample frame. Нужно убедиться, что гистограмма яркости (3) хоть иногда доходит до левого края (то есть чёрный цвет действительно является чёрным), а также иногда доходит до правого края (то есть белый цвет является белым). Если это не так, то можно улучшить контраст и яркость в этом фильме.
Например, на рис. 14 гистограмма помещается между двумя вертикальными красными линиями, то есть не достаёт ни до левого, ни до правого края. Значит можно увеличить контраст так, чтобы растянуть гистограмму по ширине, но не слишком сильно, чтобы не допустить насыщения ни в тёмной, ни в светлой области. Насыщение будет выглядеть как возвышение гистограммы у самого левого (или правого) края и будет означать потерю деталей в тёмных или светлых областях на изображении.
Для примера на рис. 14 можно добавить примерно такую строку в наш AVS-файл:
Код
ColorYUV(gain_y=0, off_y=5, gamma_y=0, cont_y=20, cont_u=20, cont_v=20)

Назначение этих параметров:
gain_y - растягивает гистограмму яркости по ширине при фиксированном левом крае.
off_y - смещает гистограмму целиком вправо (если больше нуля) или влево (если меньше нуля).
gamma_y - растягивает гистограмму так, что левый и правый края не смещаются, а смещаются только все промежуточные значения. Это можно использовать чтобы осветлить фильм без насыщения максимальной яркости.
cont_y - растягивает гистограмму относительно середины. То есть левый край смещается влево, а правый - вправо.
cont_u - если больше нуля, то увеличивает насыщенность жёлтых и синих цветов. Если меньше нуля, то уменьшает.
cont_v - если больше нуля, то увеличивает насыщенность красных и зелёных цветов. Если меньше нуля, то уменьшает.

В приведённом выше примере мы растягиваем гистограмму (увеличиваем контраст) на 20 единиц и соответственно увеличиваем насыщенность цветов, так чтобы картинка не становилась "выцветшей".

Для более точного контроля за результатом, можно навести курсор мыши на интересующую вас область в окне Filter preview, и через пару секунд вы увидите подсказку с шестнадцатиричными значениями Red,Green,Blue для данного пикселя (обведено красным на рис. 15). Максимальное значение - FF, минимальное - 00.

3.7.2 Коррекция цветов.
В случае, если требуется скорректировать цветовой оттенок (например, во всех эпизодах наблюдается чрезмерная желтизна), то нужно использовать следующие строки:
Код
ConvertToRGB32()
RGBAdjust(r=1.0, g=1.0, b=1.0, rb=0, gb=0, bb=0, rg=1.0, gg=1.0, bg=1.0)
ConvertBackToYUY2()

Вот, в двух словах, смысл этих параметров:
r, g, b - растягивают гистограмму соотв.цветового канала при фиксированном левом крае (что-то вроде яркости и контраста одновременно).
rb, gb, bb - добавляют смещение (base), так что гистограмма сдвигается вправо/влево целиком (аналог яркости)
rg, gg, bg - коррекция гамма (gamma), растягивают гистограмму так, что левый и правый края не смещаются, а смещаются только все промежуточные значения (другими словами - осветлить, но без насыщения).

Приведу несколько типичных сценариев и соответствующих им решений.
Белый цвет выглядит голубоватым, нужно убрать общий синий оттенок:
RGBAdjust(r=1.05, g=1.05, b=1.0, rb=0, gb=0, bb=0, rg=1.0, gg=1.0, bg=1.0)
Белый цвет выглядит красноватым, нужно убрать общий красный оттенок:
RGBAdjust(r=1.0, g=1.05, b=1.05, rb=0, gb=0, bb=0, rg=1.0, gg=1.0, bg=1.0)
Белый цвет выглядит белым, но нужно убрать общую желтизну:
RGBAdjust(r=1.0, g=1.0, b=1.0, rb=0, gb=0, bb=0, rg=0.95, gg=0.95, bg=1.05)
Чёрный цвет выглядит тёмно-серым, белый недостаточно светел, нужно убрать общую желтизну:
RGBAdjust(r=1.1, g=1.1, b=1.1, rb=-10, gb=-10, bb=-10, rg=0.95, gg=0.95, bg=1.05)
Всё то же самое, но нужно высветлить тёмные области:
RGBAdjust(r=1.1, g=1.1, b=1.1, rb=-10, gb=-10, bb=-10, rg=1.05, gg=1.05, bg=1.15)


3.8 Приведу здесь пример AVS-файла, в самом общем случае:
Код
mpeg2source("F:\Movie\My_Movie.d2v", cpu=4)

Telecide(guide=1,order=1)
Decimate(cycle=5)

crop(16,2,692,572)

super = MSuper(pel=2, sharp=0, chroma=true)

b_vec2 = MAnalyse(super, isb = true,  delta = 2, chroma=true, blksize=8, overlap=4)
b_vec1 = MAnalyse(super, isb = true,  delta = 1, chroma=true, blksize=8, overlap=4)
f_vec1 = MAnalyse(super, isb = false, delta = 1, chroma=true, blksize=8, overlap=4)
f_vec2 = MAnalyse(super, isb = false, delta = 2, chroma=true, blksize=8, overlap=4)

MDegrain2(super,b_vec1,f_vec1,b_vec2,f_vec2,plane=4,thsad=400)

ConvertToR GB32()
RGBAdjust(r=1.08,g=1.08,b=1.08,rb=0,gb=0,bb=0,rg=1.00,gg=1.00,bg=0.9)
ConvertBack ToYUY2()
ColorYUV(gain_y=0, off_y=0, gamma_y=0, cont_y=0, cont_u=20, cont_v=20)

BicubicResize(692,528)

Пояснения:
В качестве источника используем D2V-файл, приготовленный в DGindex. Параметр cpu=4 означает применение постпроцессинга (сглаживания), который желательно использовать только для ДВД с заметными артефактами компрессии (квадратиками).
Применяем IVTC де-интерлейсинг для NTSC ДВД (Telecide+Decimate).
Обрезаем чёрные поля (crop).
Применяем MVTools для умеренного зерна плёнки.
Используем RGBAdjust, чтобы увеличить яркость и убрать синеву изображения.
Используем ColorYUV, чтобы увеличить насыщенность цветов.
Сжимаем картинку по высоте, чтобы восстановить правильную пропорцию.

3.9 Здесь рассмотрим: кстати, кому уже надоело - милости прошу в 4-ю главу, потому как этот пункт - для продвинутых юзеров. wink2.gif
Так вот, рассмотрим, как можно применять разные настройки фильтров к разным частям фильма. Для пущей понятности сразу перейдём к примеру:
Код
mpeg2source("F:\Movies\My_Movie.d2v")

Clip1 = trim(      0, 19999)
Clip2 = trim(20000, 39999)
Clip3 = trim(40000,       0)

Clip1 = Clip1.ColorYUV(gain_y=0, off_y=0, gamma_y=0, cont_y= 0, cont_u= 0, cont_v= 0)
Clip2 = Clip2.ColorYUV(gain_y=0, off_y=0, gamma_y=0, cont_y=20, cont_u=20, cont_v=20)
Clip3 = Clip3.ColorYUV(gain_y=0, off_y=0, gamma_y=0, cont_y= 0, cont_u= 0, cont_v= 0)

Clip1 + Clip2 + Clip3

Команда trim( Кадр1, Кадр2 ) означает выборку фрагмента фильма с Кадра1 по Кадра2 включительно. Первый кадр в фильме имеет номер 0. Кадр2, равный 0, означает "конец фильма".

Таким образом, в приведённом выше примере переменная Clip1 означает фрагмент длиной в 20000 кадров от начала фильма, Clip2 - следующая часть фильма длиной 20000 кадров, а Clip3 - оставшаяся часть фильма.
Дальше видно, что яркость и контраст в Clip1 и Clip3 остаются без изменения, а в Clip2 контраст увеличивается командой ColorYUV
Последняя строка возвращает результат соединения трёх фрагментов в один фильм.

В качестве другого примера рассмотрим ситуацию, когда требуется обрезать поля разного размера в разных частях фильма:
Код
mpeg2source("F:\Movies\My_Movie.d2v")

s1 = trim(     0, 30000)
s2 = trim( 30001, 40000)
s3 = trim( 40001,     0)

s1 = s1.crop(16,2,692,572)
s2 = s2.crop(16,4,692,566)
s3 = s3.crop(16,2,692,568)

s1 = s1.BicubicResize(692,524)
s2 = s2.BicubicResize(692,524)
s3 = s3.BicubicResize(692,524)

s1 + s2 + s3
Здесь у каждого фрагмента подобраны индивидуальные размеры обрезаемых полей (команда crop(...)). Прежде чем выполнять объединение фрагментов в один, необходимо их привести к одному размеру кадра. Поэтому приходится выполнять масштабирование (команда BicubicResize(...)) для каждого фрагмента в отдельности.


--------------------
Есть сервер: 150Гб, трафик неограничен. 3.5$ в месяц на один год.





Далее: Глава 4.   Машина думает, человек отдыхает.