ТЕХНОЛОГИИ: h264. Год спустя: Технология кодирования видео в MPEG-4 AVC. Часть вторая
ТЕХНОЛОГИИ: h264. Год спустя: Технология кодирования видео в MPEG-4 AVC. Часть вторая
Автор: Филипп Казаков
Надеюсь, в конце прошлого номера я вас достаточно заинтриговал. Итак, вы открыли исходный файл с видео в AviSynth Script Creator’e и — ничего нового там еще не появилось, так что можете его смело свернуть. Теперь пробежимся по основным настройкам Script Creator’a (рис. 1).
(Окончание. Начало см. в #657.)
Закладка Options
• Input DAR: соотношение сторон входного видео. В большинстве случаев пикселы входного видео квадратные, и DAR равно отношению горизонтального разрешения картинки к вертикальному. Однако на анаморфных DVD, к примеру, пиксел прямоугольный. Если ваш источник именно такой, укажите нужное соотношение.
• Clever anamorphic encoding: умное кодирование анаморфа. Галочку следует ставить, если вы собираетесь сохранить оригинальное соотношение сторон пиксела анаморфного источника, то есть сунуть x264.exe-прямоугольники как есть. Этот вариант предпочтителен в плане создания «точных копий» DVD-дисков с заделом на будущее. Resize to mod16 предлагает автоматически изменить разрешение, сделав его кратными шестнадцати; Overcrop to achieve mod16 делает то же самое, обрезая края кадра; и последний вариант Encode non-mod16 позволяет кодировать анаморфные источники с «кривым», не кратным шестнадцати разрешением.
Более практичен другой вариант: добиться «квадратности» пикселов, уменьшив разрешение по одной из координат. В этом случае разрешение картинки уменьшается, за счет чего увеличивается плотность информации на каждый кодируемый пиксел, а всеобщая квадратность улучшает совместимость выходного потока с разными декодерами h264.
• Crop: обрезка краев кадра. Нужна только в том случае, если в исходном видео присутствуют черные полосы или некачественные области у краев экрана (которые возникают при оцифровке VHS, например).
• Resize: изменение разрешения картинки. Этот неприметный пункт требует огромного числа мышедвижений. Сразу поставьте галочку suggest resolution (она обеспечит правильное соотношение сторон и кратность вертикального и горизонтального разрешений шестнадцати) и установите максимально возможное разрешение. Хотя очевидно, что выходное разрешение должно быть не больше входного, распространено заблуждение, что оно должно быть максимально возможным. Это не совсем так — ведь чем больше разрешение, тем больше пикселов требуется закодировать компрессору, тем меньше информации приходится на каждый из них и тем больше артефактов возникает при их сжатии. Но и слишком маленькое разрешение тоже не сахар — низкая степень квантования, или, проще говоря, здоровые квадраты на экране, не особенно радует глаз. Истина лежит где-то посередине, а чтобы ее отыскать, воспользуемся старым знакомым Wabc bitrate calculator’ом (в MeGUI есть встроенный bitrate calculator, но на момент написания статьи самой нужной возможности в нем не было). Принцип его работы я уже описывал в давнишней статье о захвате, так что для экономии места позволю себе ограничиться общими словами. Задача — выбрать минимально допустимый для качественного сжатия Quality Index (QI, то есть индекс количества информации, приходящейся на каждый пиксел картинки) вашего будущего ролика так, чтобы сохранить максимальное разрешение. Чтобы определить этот самый индекс, нужно заполнить все остальные пустующие информационные поля калькулятора.
Сразу вы можете указать Disk Space — желаемый объем ролика в килобайтах, его длительность и частоту кадров (она равна частоте кадров входного материала), а также разрешение, значение которого вы только что выставили в MeGUI. Битрейт, то есть количество информации, которое придется на секунду закодированного видео, считается как частное от деления желаемого объема ролика в килобитах на его длительность в секундах. Все бы хорошо, но вы наверняка обратили внимание, что битрейтов в калькуляторе не один, а два (рис. 2). И правда — звук кодируется независимо от видео, но в финальном-то файле он свое место займет! Выходит, чтобы определиться с битрейтом видео, нужно сначала определиться с аудио. Смело ставьте значение в пределах 64—192 кбит/с для каждой дорожки на свое усмотрение. Мое усмотрение по данному вопросу зависит от целей сжатия: если ролик планируется размещать в Сети, где важен каждый мегабайт, — обойдутся юзеры и 64 кбит/с. Если же пережимается какой-нибудь DVD для себя любимого — тогда, конечно, не стоит экономить. Nero AAC по сравнению с mp3 сделал огромный шаг вперед, и таких скромных битрейтов оказывается достаточно для вполне приличного кодирования даже шестиканального звука.
Ура! Теперь вы можете посчитать битрейт видео (запомните его и выбранный аудиобитрейт!), а стало быть, и первое приближение Quality Index’a с максимально возможным разрешением картинки. x264 обеспечивает практически неотличимое от оригинала качество при QI в пределах от 1200 до 2000 в зависимости от исходного фильма. Если получившееся у вас значение QI меньше 1200, чуть уменьшите разрешение в MeGUI и пересчитайте QI заново.
Закладка Filters
• Deinterlacing: перевод чересстрочной картинки в прогрессивную, или, по-простому, ликвидация эффекта «расчески».
После нажатия магической кнопки Analyse MeGUI возьмется определить тип вашего видео. В большинстве случаев, когда источник чисто прогрессивный или чересстрочный, MeGUI не ошибается. А вот когда я сжимал документальный фильм с вкраплениями кадров старой кинохроники (естественно, прогрессивных) на фоне общей чересстрочности материала MeGUI схалтурила и предложила страшный алгоритм деинтерлейсинга, который путал полукадры на границе смены планов. Мало того что алгоритм работал крайне медленно, так в итоге все пришлось пережимать заново. Поэтому обязательно проверьте, правильно ли MeGUI выбрала метод deinterlace (это можно сделать перед началом непосредственно кодирования), и в случае чего исправьте скрипт вручную, установив стандартный деинтерлейс командой Field Deinterlace(blend=false).
• Noise Filter: шумодав. Следует отключить, только если вы сжимаете очень качественный материал (например, фильм на оригинальном двухслойном DVD или HDTV-рип). В остальных случаях выбирайте ту или иную степень шумоподавления экспериментально, руководствуясь простым правилом — работа шумодава не должна быть заметна глазу. Ведь шумодав (этот, по крайней мере) нужен вовсе не ради улучшения визуального качества картинки, а ради ее адаптации для компрессора, который может болезненно воспринимать те микрошумы, кои человеческий глаз оставит без внимания.
Все остальные настройки AviSynth Script Creator’a предлагаю оставить по умолчанию, а при желании изучить самостоятельно. Теперь сохраните скрипт. В результате получится avs-файл, который нужно открыть в Classic Media Player [Если скрипт не проиграется, скачайте и установите YuvCodecs, а также проверьте через текстовый редактор, правильно ли в скрипте указаны пути к плагинам и файлам источников. В случае ошибки, кстати, вместо видео AVISynth покажет описание ошибки и номер строчки в скрипте, где она возникла]. Перед вами окажется именно то изображение (только пикселы у avs-скрипта при просмотре будут квадратными), которое впоследствии получит и сожмет x264.exe. Можете поэкспериментировать с шумодавом и другими настройками скрипта — после сохранения изменений достаточно переоткрыть avs-файл, чтобы сразу увидеть результат. Все нормально? Длительность, разрешение, deinterlace? Тогда приступайте к кодированию.
Кодирование видео
Дальше никаких особых сложностей нет. Закройте Script Creator и отправляйтесь в основное окно MeGUI, в закладку Input. Укажите путь к avs-файлу, выставьте кодек x264 и контейнер mp4, выберите профайл HQ-Slowest для получения максимально качественного результата (свежие профайлы были автоматически скачаны при первичной настройке MeGUI), нажмите кнопочку Config напротив выбора кодека и в открывшемся окне укажите битрейт, который вы рассчитали, выбирая разрешение изображения. Все остальные настройки кодека можно оставить по умолчанию, доверившись авторам профайла, но если жажда исследования в вас до сих пор не угасла, можете почитать о них подробнее тут: mewiki.project357.com/X264_Configu-ration (на английском языке, правда).
Итак, теоретически все готово для начала кодирования. Нажмите кнопку Enqueue, в результате чего в закладке Queue главного окна MeGUI в очередь встанут два прохода кодирования видео. Во время первого прохода кодек «присматривается» ко входному материалу и «размышляет», как бы лучше размазать по нему доступные мегабайты. Результаты «размышлений» записываются во временный файл статистики. Во время второго прохода происходит непосредственно кодирование материала.
Для запуска обоих проходов служит, как нетрудно догадаться, кнопка Start, после нажатия которой ваш компьютер призадумается подобно двоечнику на экзамене (см. таблицу производительности).
Кодирование аудио
Звук, в принципе, можно пережать в той же MeGUI, но мне, честно говоря, не нравятся ее возможности по настройке командной строки neroAacEnc.exe, так что для этих целей я использую foobar2000. Единственное, кроме дистрибутива, что вам понадобится для сжатия в mp4 AAC, — это сам кодировщик neroAacEnc.exe да плагины для декодирования ac3 и DTS (разумеется, они нужны только для ac3— и DTS-файлов при пережатии DVD; поддержка WAV, mp3 и многих других форматов обеспечивается без всяких расширений), которые следует положить в папку foobar2000components. При первом запуске конвертирования Foobar2000 спросит вас, где, собственно, ему взять neroAacEnc.exe, так передайте любопытному, что MeGUI уже автоматически скачала и положила его к себе в папку.
Откройте ваши звуковые файлы в Foobar’e и по правому клику мыши выберите опцию Convert. Настройте кодек Nero, выбрав двухпроходное кодирование (ABR, two-pass, slow to encode) и указав расчетный битрейт. Нажимайте ОК, процесс пошел. Не правда ли, проще, чем с видео?
Сведение
В результате размышлений компьютера у вас теоретически должно получиться два mp4-файла — один со звуком, другой с видео. Это уже почти финал, остался последний шаг. «Замуксить», то есть свести воедино звук и видео, можно из той же MeGUI, для чего в разделе Tools -> Muxer имеется утилита mp4 muxer. Если вы успешно проделали все предыдущие действия, то с этой утилитой легко разберетесь самостоятельно. Кстати, обратите внимание, что в микшере есть возможность добавить в итоговый файл чаптеры и субтитры. Чаптеры можно задать в MeGUI (Tools -> Chapter Creator), а для субтитров существует пара замечательных бесплатных программ. Subtitle Workshop позволяет удобно оттитровать свой ролик, а SubRip — признанный авторитет в «сдирании» субтитров с DVD-дисков.
Воспроизведение
Итак, кажется, вы добрались до самого трепетного момента — просмотра результатов ваших трудов. Уймите дрожь в коленках — прежде потребуется еще одно, последнее усилие, чтобы научить вашу систему открывать mp4-файлы. Для этого необходимы декодеры h264— и AAC-потоков, а также mp4-сплиттер. Haali Media Splitter нужен потому, что по умолчанию Windows знать не знает о существовании mp4-файлов и при попытке их открыть впадает в оцепенение. В бесплатном виде декодеры имеются в составе ffdshow — известного комплексного видеодекодера.
В рамках стилистики этой статьи было бы несуразно предложить читателю такой простой выход — взять и скачать пару файлов. Тем более что установка «тяжелой» ffdshow, подхватывающей декодирование почти всех видеофайлов системы, часто бывает нежелательна. Лучше я расскажу, как декодируют mp4 настоящие «правильные пацаны». Некоторое время назад компания CoreCodec выпускала бесплатный декодер h264 под названием CoreAVC Beta. Декодер просто замечательный — и по сей день скорость его работы на 15—30% выше, чем у конкурентов (ffdshow в их числе), при идентичном качестве. Но вот незадача: жажда наживы затмила разработчикам разум, и в какой-то момент бесплатная CoreAVC Beta превратилась в платную CoreAVC 1.1. В Сети, разумеется, осела последняя бесплатная бета-версия, которую не составит труда найти. В отличие от CoreAVC 1.1, насколько я заметил, в ней нет поддержки анаморфного видео (то есть прямоугольные пикселы отображаются квадратными), а в инсталляционном пакете не прилагается упомянутый выше Haali Media Splitter для файлов mp4. Версию 1.1 найти гораздо труднее, но если вы законопослушны, то всегда можете купить ее на сайте разработчика. Пропал и отличный декодер звука Core AAC — на официальном сайте разработчика перед публикацией статьи я вообще не нашел упоминания о нем.
После того как декодеры и сплиттер будут установлены, mp4-файлы начнут открываться в любом DirectShow-проигрывателе, хоть в Windows Media Player 10. Чаптеры, переключение аудиоканалов и субтитры, правда, заработают только в каком-нибудь более приличном плейере, вроде Classic Media Player.
Итоги
Довольно почешите живот — вы создали ролик с помощью самых прогрессивных на сегодняшний день технологий и получили оптимальное соотношение качество/размер. На вашем месте я бы ни за что не поверил предыдущему высказыванию, а потому специально положил на свою домашнюю страничку несколько видеофрагментов, закодированных по вышеизложенной методике: www.finar.ru/video/previews.
Если вы заинтересовались процессом и чувствуете, что информации этого краткого обзора недостаточно, зайдите сюда:
• www.doom9.org — основной международный сайт, посвященный обработке видео. Многие авторы описанных сегодня программ и утилит собираются и обсуждают свои разработки именно тут (на английском языке);
• forum.mediatory.ru — основной русскоязычный форум, посвященный обработке видео;
• forum.ixbt.com/topic.cgi?id= 29:25719 — тема на форуме iXBT, посвященная авторскому сборнику утилит для создания AVC-видео, основанного на MeGUI. Сборник удобен при отсутствии широкополосного доступа к Сети, так как почти все необходимое находится внутри одного архива;
• mewiki.project357.com/Main_Page — детальное описание настроек MeGUI на английском языке.
Создание avs-скриптов вручную
Для продуктивной работы с MeGUI желательно понять базовые приемы языка AviSynth. Задача не простая, но приложенные усилия компенсируются полной прозрачностью процесса кодирования и широчайшими возможностями по преподготовке видео. Вы сможете создавать любые скрипты с использованием любых встроенных и внешних фильтров обработки изображения, подавая на вход любое видео, — вне зависимости от выполненных действий x264 получит на вход стандартный поток. Для AVISynth написано и свободно распространяется в Сети невероятное количество плагинов для обработки изображения и декодирования всех популярных видеоформатов. Следует, однако, помнить, что для совместимости с x264.exe нужно соблюдать несколько условий:
• разрешение сгенерированного видео должно быть кратно минимум шестнадцати, как по горизонтали, так и по вертикали;
• картинка должна быть прогрессивной (в рамках «совместимости» с этой статьей, по крайней мере);
• х264 понимает на входе видео в «родном» для MPEG цветовом пространстве YUV 4:2:0 (для перевода в это пространство в скриптах AVISynth используется команда ConvertToYV12).
Дополнительную информацию по созданию AVS-скриптов можно найти в прилагающейся к AVISynth документации и тут: forum.ixbt.com/topic.cgi?id=29:9331.