15-Май-2009. Автор: Winston

Все что нужно знать о кодеках.

Все что нужно знать о кодеках.

Обычный видеофайл содержит в себе видеодорожку, одну или несколько дорожек со звуком, одну или несколько дорожек с субтитрами, служебную информацию об используемых форматах сжатия, так называемый индекс (блок с адресами расположения конкретных участков записи, применяется во время «перемотки»), набор текстовых полей.

Формат, в котором хранится эта информация в файле, именуется контейнером. Наиболее популярным на данный момент является контейнер AVI (Audio and Video Interleaved), достаточно распространены MPEG1/2 (расширения файлов – mpg/mpe/vob), Advanced Streaming Format (asf), OGG Media (ogg), Matroska (mkv), Real Media (rm/rv/ram), QuickTime (mov/qt), начал завоевывать аудиторию контейнер MPEG4 (mp4). Кроме того, существует еще DivX Media (divx), появившийся вместе с шестой версией одноименного кодека и представляющий собой расширенный, но обратносовместимый вариант контейнера AVI. Сейчас DivX Media жалуют немногие, и, скорее всего, он не приживется.

Для извлечения из контейнера потоков видео, аудио и субтитров и их разделения используются специальные библиотеки Windows – сплиттеры, или демультиплексоры. По умолчанию в Windows (начиная с Win2000) имеются сплит­теры для AVI, MPEG1/2 и ASF. Все остальные необходимо устанавливать отдельно, что будет подробно описано ниже.

После разделения каждый из потоков файла должен быть декодирован (разжат). Для этого существуют соответствующие библиотеки, называемые кодеками.

Термин «кодек» является сокращением от «кодер-декодер» и отражает две задачи, которые такая библиотека может решать – сжатие видео в свой формат и его распаковка для воспроизведения. К слову, кодек не обязательно выполняет обе функции, существуют и такие, которые могут только первое или только второе. Скажем еще, что сжимающая часть кодека часто именуется не кодером, а энкодером.

Видеокодеки бывают нескольких типов – Video for Windows (VfW), DirectShow (DSH) и DirectX Media Object (DMO). Практически во всех плеерах при воспроизведении применяется DirectShow; а кодеки VfW используются некоторыми программами для сжатия видео, в частности очень популярной VirtualDub/VirtualDubMod. Кодеки типа DMO являются скорее подвидом DirectShow и отличаются тем, что часть их функций перекладывается на приложение, воспроизводящее видео, и по этой причине подобный тип не особо популярен. Аудиокодеки также делятся на несколько видов – Audio Compression Manager (ACM), использующийся в паре с VfW, и аналогичные видео Direct­Show и DirectX Media Object.

Специальные коды – FourCC (видео) и TwinCC (аудио) – описывают формат сжатия картинки и звука, а также определяют, что нужно для их декодирования. Однако для воспроизведения видеоряда не обязательно должен применяться тот же кодек, что и для компрессии.

Вернемся к форматам сжатия видео.
Наиболее популярным является MPEG4, представленный в виде нескольких слегка различающихся кодеков. Сам стандарт состоит из 19 частей, каждая из которых описывает определенные возможности кодека, и еще 3 находятся в процессе разработки. Все имеющиеся сейчас кодеки MPEG4, за исключением принадлежащих к стандарту H.264, представляют собой реализацию MPEG4 Part 2. Кодеки стандарта H.264 являются реализацией MPEG4 Part 10. Наиболее известными кодеками формата MPEG4 являются DivX, XviD и Windows Media Video. Кроме обычных, существуют и так называемые HD-версии, которые отличаются бо2льшим поддерживаемым разрешением – до 1920×1080 точек.

Второй по популярности (но первым по качеству) – это формат MPEG2. В нем кодируется видео на дисках DVD-Video и ведется бо2льшая часть спутникового вещания. По сравнению с MPEG4 для кодирования информации с тем же качеством формату MPEG2 необходим больший битрейт. Преимущество же MPEG2 состоит в том, что ему доступны более высокие битрейты (вплоть до 25 Mbps), а кроме того, видео в MPEG2 не страдает некоторыми «болезнями» MPEG4 (вроде ступенчатости на плавном цветовом переходе).

Формат MPEG1 на данный момент практически исчез из обихода, его можно встретить разве что в старых роликах или на Video-CD. Средства его декодирования уже давно встроены в систему.

Как было сказано выше, информация о том, каким именно кодеком упаковано видео в файле, представляется в виде FourCC-кода, состоящего из четырех символов. Каждый кодек имеет свой уникальный FourCC-код, однако в целях совместимости иногда при кодировании указывается «чужой» FourCC-код. Допустим, если видео планируется смотреть на стационарном плеере, то при сжатии его с помощью FFDshow стоит указать FourCC не FFDS, а DivX или XviD, иначе файл почти наверняка не воспроизведется.

Теперь перейдем к форматам сжатия аудио. Бесспорным (пока) лидером здесь является MP3 (полное название – MPEG1 Layer 3). Основной его недостаток – поддержка всего двух каналов аудио. Такого ограничения нет у созданного на его основе формата AAC, а также у технологий AC3 (Dolby Digital) и DTS. Формат Windows Media Audio, затевавшийся как конкурент MP3 и дающий возможность добиться лучшего качества на низких битрейтах, к настоящему времени обзавелся поддержкой многоканального звука и выступает уже как конкурент AAC. Достаточно популярен и OGG Vobris, который позволяет получить качество, сравнимое с MP3, на более низких битрейтах, или более высокое – на равных. Информация о формате аудио хранится в TwinCC-коде, представляющем собой комбинацию из четырех цифр, к примеру 0055 для MP3.

Решение проблем с кодеками.

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

Если файл отказывается воспроизводиться, необходимо выяснить, какого именно системного компонента не хватает для нормальной работы. В первую очередь – определить тип контейнера у данного файла и убедиться, установлен ли в системе соответствующий сплиттер. Если да, то, скорее всего, загвоздка в отсутствии кодека. Узнать его FourCC-код поможет программа GSpot, скачать которую можно по адресу http://gspot.headbands.com/. Открываем в ней проблемный файл, и в правой верхней части окна видим FourCC-код, название кодека и его наличие/отсутствие в системе. К сожалению, GSpot работает только с контейнерами AVI и MPEG1/2, потому в случае новых ogg, mkv или mp4 придется действовать иначе. Открываем файл в VirtualDubMod, в меню File выбираем пункт File Information – в строке FourCC Code находится необходимая нам информация.

Теперь стоит заглянуть в настройки FFD­show (ярлык Video decoder configuration), поскольку по умолчанию включена поддержка только самых основных форматов (из полусотни «знакомых» программе). Если нужного там не окажется, то узнать, какому кодеку соответствует полученный FourCC-код, можно в уже упомянутой программе GSpot, выбрав в меню Tables пункт Video Codecs. Если и это не поможет, то просматриваем большой список FourCC-кодов, расположенный по адресу www.fourcc.org, там же есть и ссылки на страницы закачки описанных кодеков.

Перейдем к следующей проблеме, которая встречается намного чаще. Файл открывается, начинается воспроизведение, однако изображение отсутствует или выводится неправильно. Причиной этого обычно является использование неподходящего декодера или, что бывает намного реже, ошибка в декодере. И тут надо объяснить, почему не стоит применять кодек-паки – чаще всего виновниками подобных недоразумений оказываются именно они. В качестве примера возьмем достаточно популярный K-Lite Codec Pack. Его полная версия представляет собой свалку всего, что попало под руку составителю. Отметим самые яркие проявления подобного подхода: в K-Lite Codec Pack Full имеются три кодека для MPEG2 (не считая FFDshow), столько же сплиттеров для MPEG2, по три кодека для MP3, AAC и AC3, из кодеков MPEG4, кроме последних версий DivX, XviD и FFDshow, есть редко встречающийся 3ivX Pro и старые версии MS MPEG4 и DivX 3.11.

После установки подобной «солянки» вероятность того, что для декодирования будет использован не самый подходящий кодек, многократно возрастает. Да, бывают и достаточно сбалансированные кодек-паки, но им присущ еще один недостаток: как только обновляется один из компонентов кодек-пака, приходится закачивать заново весь сборник.

Вернемся к проблеме неправильного декодера. Читатель, последовавший советам практической части нашей статьи, может задать вопрос – а откуда возьмется неправильный декодер, если я его не инсталлировал? Это происходит из-за того, что некоторые приложения считают своим долгом установить различные кодеки и сплиттеры, даже не спрашивая разрешения у пользователя. В первую очередь этим грешат программы для обработки видео в MPEG2/4, ПО для тюнеров, DVD-плееры и даже Nero Burning ROM – последний при установке добавляет в систему больше десятка своих кодеков и сплиттеров для форматов MPEG2/4 и QuickTime; при инсталляции InterVideo WinDVD 7 без спроса устанавливаются кодеки DivX 6.

Имеют такое свойство и игры: к примеру, демо-версия Mayabin3 без спроса внедряет в систему кодек XviD и предлагает добавить еще ogg splitter неизвестно какой давности. К тому же штатной возможности удалить такой кодек игра не предоставляет, так что после ее деинсталляции чистить систему приходится вручную. Стоит отметить, что проблемы с воспроизведением видео возникают не из-за простой установки дополнительных продуктов, а из-за того, что подобные программы назначают своим кодекам бóльшие приоритеты, то есть подменяют ими уже имеющиеся в системе.

Бороться с «нелегалами» достаточно легко. Например, файлы кодеков можно просто удалить. Однако некоторые из них бывают нужны для нормального функционирования инсталлировавших их программ, и потому лучше оставить новые кодеки в системе, но не давать их использовать никаким приложениям, кроме «родного». Сделать это можно с помощью уже упоминавшейся программы GSpot. Открываем в ней файл, при воспроизведении которого задействуется неправильный кодек, и в разделе Proposed Codec Solutions and Test нажимаем кнопку 1 под надписью A/V. В текстовом поле справа появится информация о кодеках, которые будут использоваться для проигрывания данного файла. Узнав название «лишнего» кодека, идем в меню Options и выбираем пункт Settings. Активируем Expert Mode: Enable codec management functions on menus, что позволит управлять приоритетом кодеков прямо из программы. Закрываем окно настроек, выбираем в меню System команду List Codecs and Other Filters. В появившемся списке находим необходимый кодек, щелкаем на нем правой кнопкой и останавливаемся на опции Set Filter Merit… контекстного меню. В появившемся окне перемещаем ползунок вниз до значения 0×200000 (можно и ниже, но нежелательно).

После данной операции этот кодек будет использоваться, только если программа явно к нему обратится.

Последняя группа недоразумений при воспроизведении видео связана с возможной несовместимостью декодеров/сплиттеров с видеоплеерами, ошибками самих декодеров и случаями повреждения видеофайлов. Первую ситуацию диагностировать просто: достаточно открыть файл в другом проигрывателе (или даже в GSpot), и если проблема исчезла, то ее источник – именно несовместимость плеера и кодека. Когда воспроизведение файла затруднено и в другом проигрывателе, скорее всего виновником этого является ошибка в кодеке, и стоит либо обновить его, либо, наоборот, вернуться к более старой версии, на которой подобных ошибок не наблюдалось. Если же файл поврежден, его можно попытаться исправить с помощью VirtualDubMod. Данный способ годится только для файлов в контейнерах avi, mkv или ogg. В меню File выбираем команду Open, ставим внизу окна галочку возле пункта Ask for extended options after this dialog, находим нужный файл и нажимаем Открыть. В появившемся окне отмечаем птичкой пункт Re-derive keyframe flags и жмем OK. По завершении операции выбираем в меню Video в пункте Scan video streams for errors подпункт Scan. После окончания этой про­цедуры идем в меню File → Save As, указываем новое имя для исправленного файла и внизу окна в пункте Video Mode выбираем Direct Stream Copy. В результате получаем рабочий файл с частями видео, которые не были повреждены.