Создание видеодорожки для DVD (mpeg2) из прогрессивного HD-источника (h264) и сопутствующие моменты


by Boris G ®
25-Мар-2018 18:24

[Цитировать]

Создание видеодорожки для DVD (mpeg2) из прогрессивного HD-источника (h264) и сопутствующие моменты

Введение
В последнее время приходится всё чаше встречаться с видеоматериалом в HD-качестве (т.е. в высоком разрешении). Тем не менее, хочется сохранить себе в коллекцию данное видео именно в DVD-формате (причины могут быть разные, не будем углубляться в этот вопрос). Наиболее часто приходится иметь дело с файлом формата MKV (контейнер «матрёшка»), содержащим видео, сжатое кодеком h264. Именно для этого типового варианта и составлена данная инструкция.
Инструкция разделена на три части, так как весь процесс преобразования формата видео можно разделить на три стадии:
а) декодирование исходного формата;
б) преобразование параметров видео (разрешение, цветовая шкала и т.п.);
в) кодирование в требуемый формат.
Существует два основных подхода к реализации данного процесса. Первый подход состоит в том, что каждая стадия для всего видеоряда должна полностью завершиться до начала следующей. Результаты каждой стадии сохраняются на жестком диске в виде файлов. Но при этом потребуются слишком большие объемы дискового пространства (особенно для хранения несжатого видео после первой и второй стадий). По этой причине рассматривается только второй подход – следующая стадия начинается, когда один кадр прошел предыдущую (т.е. происходит покадровая передача кадров по цепочке). В этой ситуации нет необходимости хранения огромных файлов с промежуточной информацией. Но для связи отдельных операций в единый процесс потребуется специальное средство – фрейм-сервер AVISynth.
Часть 1
Декодирование HD-видео

Для того, чтобы декодировать h264-видео при помощи AVISynth, необходимо воспользоваться специально предназначенным для этого плагином. Владельцы видеокарт NVidea с CUDA имеют возможность пользоваться лучшим декодером - DGDecNV (между прочим, данный декодер заточен под исходники с размером по высоте, кратным 8, если у Вас исходник с некратным размером - обратите внимание на нижние строчки декодированной картинки - там могут появиться зеркальные повторы нескольких нижних строк оригинальной картинки). Остальным придется пользоваться универсальным вариантом - бесплатным декодером FFMpegSource2.
В данном примере файлы универсального декодера скачаны с официального сайта и помещены в папку C:\Program Files\FFMpegSource2\. Сам видеоматериал (файл film.mkv) помещен в папку D:\Video\.
Рис.1

Чтобы процесс декодирования прошел успешно, видеоматериал должен быть проиндексирован, т.е. декодер должен предварительно «познакомиться» с материалом. Для этого в проводнике Windows щелкаем правой кнопкой мышки на файле film.mkv и в меню выбираем вариант «Открыть с помощью…» - «Выбрать программу» (галочку "всегда использовать эту программу" лучше снять, чтобы не терять привязку видео-файлов к любимому плееру). В появившемся окне с помощью кнопки «Обзор» указываем в качестве программы утилиту ffmsindex.exe из папки декодера.
Через пару минут в папке D:\Video\ появится служебный файл film.mkv.ffindex.
Покадровое декодирование самого видео при посредничестве фрейм-сервера AVISynth начнется при открытии в видеоредакторе или кодировщике скрипта - специального текстового файла с командами, имеющего расширение *.avs (в примере он будет называться scrypt.avs). Ниже приводится текст скрипта (скрипт можно писать стандартным Блокнотом Windows), с помощью которого можно убедится в работе декодера и посмотреть на параметры видеодорожки:
Цитата:
LoadPlugin("C:\Program Files\FFMpegSource2\ffms2.dll") # подключение декодера
FFVideoSource("D:\Video\film.mkv") #открытие видео
Coloryuv(analyze=true) #проверка, цветового диапазона
Открыв полученный скрипт scrypt.avs в программе VirtualDub, просмотрим несколько эпизодов видео, обращая внимание на показатели, которые на скриншоте обведены красной рамкой.
Рис. 2

Наблюдение за колебаниями этих параметров позволяет сделать вывод о типе яркостной шкалы: 0-255 или 16-235. В примере явно имеет место шкала 16-235, так как параметры ни разу не вышли за границы этого диапазона. Следует отметить, что единичные переходы границ на 1 пункт скорее следует воспринимать как ошибки, так как признаком шкалы 0-255 будет более существенный и стабильный выход за границы 16 вниз и 235 вверх.
Часть 2
Подготовка видео к кодированию

Прежде всего, надо удалить из скрипта ненужную команду анализа видео (мы ведь не хотим любоваться значениями параметров яркости при просмотре фильма на домашнем кинотеатре в семейном кругу).
Также следует обратить внимание на размер кадра. Если размер видео-кадра по вертикали не кратен 4-м, то могут возникнуть неприятные проблемы при преобразованиях. В такой ситуации (а в примере видео имеет вертикальное разрешение 546 точек) следует сразу после открытия видеофайла обеспечить такую кратность подрезкой нижней части кадра высокого разрешения на 2 пикселя. Для этого добавим в скрипт команду:
Цитата:
crop (0,0,0,-2) # если высота не кратна 4
Далее следует произвести конверсию цветового пространства при помощи плагина AutoYUY2. В данном примере файлы плагина скачаны с официального сайта и помещены в папку C:\Program Files\AutoYUY2\. Добавляем в скрипт строки:
Цитата:
LoadPlugin("C:\Program Files\AutoYUY2\AutoYUY2.dll") #подключение плагина
AutoYUY2() # конверсия цветового пространства
Следующим этапом подготовки видео является корректировка матрицы цветовых коэффициентов с помощью плагина ColorMatrix. В данном примере файлы плагина скачаны с официального сайта разработчиков и помещены в папку C:\Program Files\ColorMatrix\. Добавляем в скрипт строки:
Цитата:
LoadPlugin("C:\Program Files\ColorMatrix\ColorMatrix.dll")
ColorMatrix(mode="Rec.709->Rec.601", inputFR=false, clamp=0) # 16-235
#ColorMatrix(mode="Rec.709->Rec.601", inputFR=true, clamp=0) # 0-255
Как видно, две строчки с Colormatrix почти одинаковые (они используются в случае, если анализ в VirtualDub показал те или иные результаты). Решеточкой отключается ненужный вариант. Для нашего исходника останется вариант с яркостью 16-235, а второй вариант превращен просто в комментарий.
Теперь поговорим о размере и пропорциях картинки. На HD-источниках используют так называемые "квадратные" пиксели, соответсвенно, отношение количества точек по вертикали и горизонтали совпадает с пропорциями самой картинки.
Высокое разрешение на подходит для DVD. Максимальным разрешением для DVD является 720х576 (для PAL) или 720х480 (для NTSC). При этом в обоих случаях используются "неквадратные" пиксели разной степени "сплющенности" - первая степень сплющенности позволяет формировать картинку с пропорциями 4:3, вторая степень - 16:9.
Так как придется считать, то введем следующие обозначения:
Ho - высота исходного видео в пикселях;
Wo - ширина исходного видео в пикселях;
AR - пропорции будущего DVD (AR=4/3 или AR=16/9);
hhh - высота полезного изображения на DVD;
www - ширина полезного изображения на DVD;
bbb - ширина каждой из 2-х (верхней и нижней) "черных полос", дополняющих полезное изображение до полного кадра на DVD.
Определение размеров для PAL:
Цитата:
www = 720
hhh = 576 * AR * Ho / Wo (округляем до ближайшего числа, кратного 8)
bbb = (576 - hhh) / 2
Определение размеров для NTSC:
Цитата:
www = 720
hhh = 480 * AR * Ho / Wo (округляем до ближайшего числа, кратного 8)
bbb = (480 - hhh) / 2
В примере исходник, имеющий после подрезки размеры Wo=1280, Ho=544, кодируется в PAL DVD, у которого AR=16/9. C учетом округлений до кратности 8 получаем: www=720, hhh = 432 пикселей, bbb = 72.
С учетом этого добавляем в скрипт scrypt.avs команды изменения размеров кадра:
Цитата:
BicubicResize(720, 432, 0, 0.5) #ресайз методом Catmull-Rom spline
AddBorders (0,72,0,72) # добавление черных полос
Немного о ресайзе
При помощи двух последних параметров функции BicubicResize(H, W, b, c) можно немного менять резкость картинки.
Два этих параметра связаны соотношением: b + 2*c = 1. Математически предел резкости метода достигается при b=0, c=0.5..
Отрицательные b недопустимы, но можно задать с>0.5. В этом случае начнется процесс "подчеркивания контуров" (crispening) за счет снижения динамического диапазона изображения.
Лично я (надеюсь, как и большинство форумчан) не одобряю псевдо-резкость, поэтому рекомендую - не увлекайтесь этим.
Также популярным и часто используемым при переводе HD в стандартное (DVD-шное) разрешение являются ресайзеры серии Ланцош - например, Lanczos4Resize. Четкость вроде немного повыше, чем у Саtmull-Rom, а особо криминальных артефактов не заметно. В любом случае знайте, что существует великое множество алгоритмов ресайза, и у каждого из них есть свои достоинства и недостатки...
Кроме того, следует учесть, что частота кадров фильма в системе PAL составляет 25 кадров в секунду (в NTSC – 23,976 кадров в секунду). Зададим нужную частоту кадров добавлением в скрипт команды:
Цитата:
AssumeFPS(25) #изменение частоты кадров под стандарт PAL 25 кадров/сек
Если бы на выходе требовалось подготовить материал в NTSC, то надо было бы вставить команду:
Цитата:
AssumeFPS ("ntsc_film") #изменение частоты кадров под стандарт NTSC
О скорости воспроизведения музыкальных фильмов
При кодировании фильмов типа фильма "Стена" А. Паркера следут избегать изменения скорости воспроизведения, которая вынуждает "портить" ускорением или замедлением музыкальные композиции. В этом случае оригинальную скорость исходника (в данном случае это 24 кадра в секунду) следует сохранить.
Поэтому вне зависимости от того, под какой стандарт DVD готовится видеодорожка, следует подтвердить частоту кадров исходника. В данном случае при помощи команды
Цитата:
AssumeFPS (24) #подтверждение кинотеатральной частоты кадров
Конечно, добавляемый при авторинге к такому видеоряду звук должен иметь аналогичную скорость воспроизведения, чтобы соблюдалась его синхронность с видео.
В итоге полный текст скрипта для PAL scrypt.avs будет выглядеть так:
Цитата:
LoadPlugin("C:\Program Files\FFMpegSource2\ffms2.dll") # подключение декодера
FFVideoSource("D:\Video\film.mkv") #открытие видео
crop (0,0,0,-2) # если высота не кратна 4
LoadPlugin("C:\Program Files\AutoYUY2\AutoYUY2.dll") #подключение плагина
AutoYUY2() # конверсия цветового пространства
LoadPlugin("C:\Program Files\ColorMatrix\ColorMatrix.dll") #подключение плагина
ColorMatrix(mode="Rec.709->Rec.601", inputFR=false, clamp=0) # 16-235
#ColorMatrix(mode="Rec.709->Rec.601", inputFR=true, clamp=0) # 0-255
BicubicResize(720, 432, 0, 0.5) #ресайз методом Catmull-Rom spline
AddBorders (0,72,0,72) # добавление черных полос
AssumeFPS(25) #изменение частоты кадров под стандарт PAL 25 кадров/сек
Этот скрипт будет использоваться для подачи подготовленного видео в кодировщик MPEG2.
Часть 3 Кодируем видеодорожку
Вариант 1 - кодировщик Cinema Craft Encoder SP3Запускаем предварительно инсталлированный кодировщик CCE SP3.

В пустом поле слева (рис. 3) щелкаем правой кнопкой мышки и выбираем Add Source...
Рис. 3

Через появившийся стандартный Проводник (рис.4) показываем файл скрипта scrypt.avs (становится виден, если выбран показ «все файлы»).
Рис. 4

Выскочит окошко, предлагающее выбрать базовый тип проекта. В данном случае следует указать «PAL DVD Film» (рис. 5).
При создании видеодорожки для диска в стандарте NTSC надо выбрать вариант «NTSC DVD Film (pulldown)».
Рис. 5

В правой части главного окна кнопкой 1 (рис. 6) раскроем настройки видео и зададим нужные нам параметры: предназначение дорожки (позиция 2), телевизионную систему (позиция 3), соотношение сторон (позиция 4). В позиции 3 следует выбрать многопроходное кодирование с переменным битрейтом и задать количество таких проходов в позиции 6 (двух-трех проходов вполне достаточно).
Рис. 6

Для системы PAL характерно воспроизведение фильмов со скоростью 25 кадров в секунду (поз. 7). При кодировании фильма в NTSC следует в этой позиции выбрать 23,976 и чуть правее указать тип пуллдауна, например, 3:2 pulldown. В обоих случаях должна быть снята галочка Rate Conv.
В позиции 8 следует указать желаемый размер видеодорожки в тех или иных единицах измерения, исходя из доступного места на DVD-болванке с учетом размеров звуковых дорожек, бонусов и меню. Этот размер будет определять значение среднего битрейта (первое число в позиции 9), по этой причине надо следить, чтобы он не превысил максимально допустимого. Максимально допустимый битрейт видео (третье число в позиции 9) не может быть более 9800 кбит/сек. Также максимальный битрейт ограничивается условием нахождения суммарного битрейта фильма (видео со всеми звуковыми дорожками и субтитрами) в пределах 10 Мбит/сек. Минимальный битрейт (второе число в позиции 9) не рекомендуется ставить менее 2000 кбит/сек.
После установки этих настроек кнопкой 1 можно обратно свернуть Video settigs и приступить к настройке MPEG Settings, окно которых разворачивается соответствующей кнопкой в правой части главного окна программы.
Рис. 7

В данном окне можно оставить неизменными все настройки, кроме поля «Offset line». Для нашего прогрессивного исходника в этом окне следует выставить «0».
О кодировании в 24 кадра в секунду
В связи с отсутствием в CCE готовых пресетов для создания видеодорожки из исходника 24 к/сек даже для NTSC-DVD, способом получить дорожку 29,97 кадров в секунду является или отказ от CCE в пользу кодировщика Carbon Coder (я бы лично так и порекомендовал - он имеет вариант настроек для 24p->29,97i) или создание видео "не для DVD" стандартного разрешения (например, 720х480 с прицелом на NTSC) с такими настройками (см. спойлеер):

Для преобразования такой дорожки к совместимому с DVD виду потребуется обработать полученный после кодирования файл с помощью программы DGPulldown (комментарии по программе см. в конце инструкции). Для случая NTSC в DGPulldown следует отметить опцию 24->29,97 (см. рис. 19).
Для более тонкой настройки параметров кодирования следует переместиться в главное меню программы в пункт «Window». В этом меню выберем пункт «Picture» (рис. 8).
Рис. 8

После этого откроется окно (рис. 9) в котором следует указать настройки кодирования наилучшим образом учитывающие особенности исходного видео.
Рис. 9

Любые параметры могут быть установлены вручную, но это задача для профессионала, которому данная инструкция не нужна. Начинающим рекомендуется первым делом выбрать один из подходящих наборов параметров (пресетов) в верхней части окна. При выборе следует учесть следующее:
- пресеты группы Natural адаптированы под стандартное игровое или документальное кино;
- пресеты группы Animation заточены под рисованные мультфильмы с четкими контрастными границами объектов;
- пресеты группы CG подходят для более мягкой компьютерной графики;
- цифра в обозначении пресета говорит о степени подавления мелких деталей в изображении, чем больший номер имеет пресет в пределах группы, тем сильнее «замыливается» картинка (данная трактовка отличается от разъяснений разработчиков CCE, но более наглядно описывает результат применения пресета).
Только после выбора пресета следует в нижней части окна указать прогрессивный характер источника видео (красная стрелка на рис. 9). А самом нижнем левом углу в для прогрессивной картинки рекомендуется выбрать метод сканирования блоков "Zigzag".
В ССE SP2 в этом окне была кнопочка "Apply" (применить). Теперь её нет. Чтобы выбранные настройки сохранились для дальнейшего использования в рамках сеанса работы с программой, надо нажать кнопку SAVE в верхней части окна и сохранить настройки под адекватным именем (например, "Четкий прогрессив"). Если хотите сохранить их и на будущее, то также нажмите кнопку SAVE в нижней части окна и сохраните в файл.
Далее следует закрыть это окно и настроить параметры матрицы квантизации через меню Window – Segment (рис. 10).
Рис. 10

Как и в предыдущем случае, новичкам имеет смысл выбирать одну из предлагаемых разработчиками матриц (рис. 11). Чтобы выбор был обоснованным следует дать некоторые разъяснения.

Рис. 11


Матрица Natural 1 является предлагаемой по умолчанию матрицей и не имеет четкой ориентации – универсальная матрица «для всего». В случае игрового кино (live-action) лучший результат может показать матрица Natural 2. Если кодирование несложного видео (нет пламени, водной ряби, листвы на деревьях и быстрых движений) ведется с высоким битрейтом можно порекомендовать матрицу MPEG Standard. Матрица СG 1 подойдет для мультфильмов и компьютерной графики, а в ситуации недостаточно высокого битрейта можно воспользоваться её модификацией СG 2.
Если Вы выбрали какой-то пресет, отличный от Natural 1, или сами создали в данном окне матрицу - сохраните установки под подходящим именем (например, я выбрал матрицу Mpeg Standard и сохранил эту настройку сегмента под именем "Матрица Мпег Стандарт") - действия аналогичны описанным выше (сохранение параметров Picture).
После выбора матрицы можно закрыть данное окно.
Теперь выбранные нами настройки Picture и Segment надо привязать к самому видео. Для этого в главном окне программы надо дважды щелкнуть на маркере начала нужного фрагмента фильма (см. рис. 11+ ). Так как мы не делили фильм на фрагменты, то из двух маркеров (маркер начала и маркер конца) это будет первый (с временной меткой 00:00:00:00). В появившемся окошке надо поставить галочки в позициях Segment и Picture и в соответствующих полях выбрать сохраненные пользовательские настройки. После этого нажимаем ОК.
Рис. 11+

Как видим (рис. 11+), в главном окне возле маркера начала сегмента (фильма) появились выбранные пользовательские установки. Теперь можно приступать к кодированию. Для этого в левой части главного окна программы надо щелкнуть правой кнопкой мышки на имени скрипта и выбрать вариант «Encode» (рис. 12). Когда кодирование закончится (это очень долгий процесс), программу можно закрыть. В папке D:\Video\ появится файл видеодорожки scrypt.m2v.
Рис. 12

Вариант 2 - кодировщик Rhozet Carbon Coder
Процедура работы в Carbon Coder значительно проще. После запуска программы открываем скрипт (Source – Add).
Рис. 13

Подскажем кодировщику, что видео на входе в данном примере прогрессивное (non-interlaced), имеет пропорции 16:9 (при указании этого пункта в диалоговом окне Source Pixel Aspect Ratio должен быть выбран DV PAL или DV NTSC в зависимости от нашего материала) и не содержит аудио (рис. 14).
Рис. 14

Теперь укажем характеристики желаемого видео. Для начала укажем (рис. 15) «целевой шаблон» - DVD системы PAL наивысшего качества (или NTSC, если собираемся делать такой вариант).
Рис. 15

В появившемся окне (рис. 16) внесем изменения в настройки:
1 – укажем папку назначения;
2 – зададим пропорции изображения;
3 – включим двухпроходное кодирование;
4 – укажем средний, минимальный и максимальный битрейт (соображения по поводу битрейта аналогичны рассмотренным выше для варианта с CCE SP3;
5 – отключим работу с аудио.
Рис. 16

На рис. 17 показаны отличия в настройках для кодирования видеодорожки в стандарте NTSC (если в скрипте было принято решение подтвердить киношную скорость воспроизведения музыкального фильма, то в поле Frame Rate выбирается опция 24p->29,97i).
Рис. 17

Следует отметить, что Carbon Coder для DVD предлагает применять интерлейсное кодирование (отдельно кодируются четные строки изображения, отдельно нечетные).
Тем не менее, при кодировании прогрессивного фильма с пресетами 23,976p->29,97i и 24p->29,97i по факту кодирование получается прогрессивным (целыми кадрами). А вот c пресетом DVD-PAL результат получается закодированным полями (интерлейсное кодирование).
Для повышения качества кодиирования кинофильма в PAL (прогрессивное кодирование считается борлее качественным) данную особенность Carbon Coder-а можно обойти, выбрав вариант прогрессивного кодирования. Для этого надо (см. рис.16/17):
а) в пункте Stream Format - выбрать вариант Generic ISO Mpeg Stream;
б) в пункте Interlacing - выбрать вариант Non-Interlaced
в) выставить вручную разрешение и частоту кадров (fps = кадров в секунду) - для PAL (720x576 и 25fps).
Теперь можно запускать процесс кодирования (рис. 18).
Рис. 18

По окончании процесса кодирования в папке D:\Video появится файл видеодорожки scrypt_MPEG2_DVD_PAL(Mastering).m2v
Немного о кодировании музыкальных фильмов в PAL
PAL-издание упомянутого фильма А.Паркера "Стена" закодировано в интерлейсе методом "хард-телесин" (т.е. реальное кодирование всех дублирующих полей), причем после каждых 12 кадров добавляется дублирующее поле (один раз нижнее, в следующий раз верхнее), а оригинальное поле переносится в следующий кадр, и этот сдвиг полей повторяется и в следующих кадрах (так называемый 2:2 pulldown). В результате видеоряд представляет собой чередование цепочек из 12 кадров без "гребёнки" и из 13 кадров с "гребёнкой". С учетом того, что телевизоры по факту проводят деинтерлейс с удвоением частоты кадров (переводят 25i в 50p), то такая технология обеспечивает более плавное воспроизведение фильма, чем просто повтор каждого 24-го кадра.
Чтобы самостоятельно осуществить нечто подобное c использованием "софт-телесина" с добавлением флагов, надо закодировать видео без пресета DVD (но с правильным размером кадра в пикселях) в обычный MPEG2 c частотой 24 кадра в секунду.
Полученный видеофайл в дальнейшем стоит пропустить через утилиту DGPulldown.Интерфейс у программы простейший:
Рис. 19

Выбираем исходный файл (Source ES), указываем имя файла для сохранения (Dest ES), выбираем вариант "Custom" и указываем исходный фреймрейт 24 и конечный 25. После чего нажимаем кнопку "Convert".
Конец
P.S. Многопроходному кодированию может начать ставить палки в колеса антивирус! Настройте его грамотно или отключите на время кодирования...



Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы