Кодек - это сокращение от КОдер/ДЕКодер, и по сути является небольшой программой. Кодек всегда является звеном в цепочке программ, которые получают поток данных из источника, производят над ним какие-нибудь хитрые манипуляции, и помещают в какой-либо другой поток данных. Поток данных на входе может быть как файлом, например не зажатым видеофайлом, или зажатым в другом формате (напр. MPEG-1), так и видеопотоком от цифровой камеры или TV. В первом случае входной поток генерируется драйвером файловой системы Вашей операционки, который берет файл, находящийся на жестком диске, и направляет его кодеку (точнее, цепочке программ, звеном которой является кодек). Во втором случае входной поток генерируется драйвером устройства, которое поставляет видеопоток (например, драйвером TV-тюнера или драйвером видеокарты, при записи с видеовхода). Цепочка программ, частью которой является кодек, различна в завосимости от того, что Вы делаете. Если Вы кодируете файл, то типичная цепочка программ может быть такой:
Avisynth, который получает входной поток от драйвера файловой системы и производит определенный препроцессинг, например обрезку черных полос, деинтерлейсинг и ресайз (и много чего еще, в зависимости от Вашего avisynth-скрипта).
Virtualdub, который получает выходной поток от Avisynth, конвертирует его в понятный себе формат, и производит его препроцессинг (при использовании фильтров). Далее Virtualdub направляет видеопоток кодеку.
Кодек производит собственно компрессию видеопотока в тот формат, который Вы хотите получить, а затем возвращает уже зажатый видеопоток Virtualdub'у.
Virtualdub перенаправляет скомпрессированные данные драйверу файловой системы, который в свою очередь помещает их на жесткий диск в том виде, который был указан Virtualdub.
При воспроизведении принцип тот же самый, только цепочка программ будет немного отличаться:
Драйвер файловой системы направляет поток данных из файла, который Вы хотите проиграть, на вход Вашему медиаплееру (Light Alloy, Crystal Player, Windows Media Player и т.п.).
Медиаплеер исследует поток данных, и обращается к своему встроенному списку кодеков (как, например, делает Media Player Classic), либо к внешнему списку кодеков (находящихся в реестре Windows) в поисках подходящего кодека. Если плеер его не находит, то выводит на экран сообщение типа "не найден соответствующий декомпрессор", и ожидает, пока Вы не установите нужный кодек. Если плеер находит кодек, то он направляет поток данных кодеку.
Кодек производит декодирование, и направляет распакованный поток данных назад плееру, который в свою очередь перенаправляет его драйверу видеокарты. Видеокарта уже выводит его либо на экран монитора, либо на TV-выход.
Примечание 1. В зависимости от Ваших настроек, сам медиаплеер также может производить некоторую обработку видеопотока, напр. увеличение яркости и/или контраста и т.п.
Примечание 2. Обычно файл содержит более одного потока данных. Как правило файл (напр. avi) содержит один видеопоток и один или более аудиопотоков. Более передовые контейнеры (OGM, Matroska, MP4) могут содержать много потоков данных, включая информацию о главах, субтитры и т.п. Для этих передовых контейнеров также необходимо установить небольшую программку - сплиттер. Это не кодек, но он необходим, чтобы медиаплеер мог понять, как потоки данных хранятся в контейнере. Windows поставляется со встроенной поддержкой контейнеров AVI и MPEG, поэтому большинство плееров без проблем могут проигрывать эти файлы. Существует много форматов контейнеров, каждый из которых имеет свои уникальные особенности.
Т.е., другими словами, видео кодеки - специальные алгоритмы упаковки видео изображения. Если их не использовать, видео будет представлять набор .BMP-картинок, по одной на каждый кадр. Поэтому средний фильм будет занимать десятки гигабайт.
Кодеки делятся на два типа:
Lossless ("беспотерьные"), зажимающие видео без потери информации. Т.е., образно говоря, все BMP-шки упаковываютя RAR. Недостаток таких кодеков - низкая степень сжатия. Фильм, зажатый таким кодеком, все равно будет занимать не один гигабайт, поэтому они чаще используются как промежуточный формат при монтаже цифрового видео. Примером таких кодеков может послужить Motion JPEG (
www.jpg.com).
Lossy кодеки зажимают видео с потерей информации. То есть считают некоторую часть информации не нужной и отбрасывают ее, а всю остальную информацию жестоко сжимают. За счет этого достигается высокая степень сжатия. Качесво кодека определяется заложенным алгоритмом, по которому он (кодек) решает, какую информацию можно выбросить, а какую нужно оставить. Примерами таких кодеков являются DivX, Xvid, VP6, Mpeg, H.264.
Принцип работы "потерьных" (lossy) кодеков примерно следующий. В видеопотоке, зажатом одним из этих кодеков, можно выделить I-кадры (Intra) и P-кадры (предсказанные). I-кадр представляет собой одну картинку из видеопотока, сжатую алгоритмом типа JPEG, то есть изображение передается целиком. Если бы каждый кадр фильма пришлось сжимать индивидуально, мы бы никогда не достигли высокой степени сжатия MPEG-4/DivX (чем и страдают lossless-кодеки, т.к. видеопоток, зажатый lossless-кодеком, состоит полностью из I-кадров). Поэтому в потоке используются P-кадры. Принцип их использования легче всего объяснить на примере: представьте себе программу новостей и диктора в ней. В течение программы фон за диктором, по большей части, остается неизменным. Поэтому мы можем отбросить ненужный фон и описывать только изменения, происходящие в избранных участках изображения. Для этого следует поделить изображение на отдельные блоки. Временные изменения блоков кодируются в P кадре. Чтобы еше больше увеличить степень компрессии, были разработаны B-кадры ("Bidirectional" - двунаправленный). В них содержится информация об изменении изображения как на основе предыдущего кадра, так и следующего.
Для кодирования фильмов используютя именно "потерьные" (lossy) кодеки. Из них чаще всего используются кодеки, соответствующие стандарту MPEG.
Теперь о двухпроходном режиме и переменном битрейте. Большинство кодеков разработаны таким образом, что они видят не картинку целиком, а только объекты и изменение картинки от кадра к кадру. Из этого можно сделать вывод, что шумное видео сложнее сжимать, чем чистое и статичные картины так же проще сжимаются, чем динамичные (именно эту информацию и собирает кодек во время первого прохода). Допустим, у вас есть какой-то ролик или фильм. В любом видео, не бывает, что бы было абсолютно монотонное движение и неизменное количество объектов. Получается, что для каждого кадра нужно выделять разное количество памяти. Для того, что бы выделять каждому кадру своё количество битрейта, был введён переменный битрейт. То есть, во время первого прохода кодек собирает информацию о количестве движения и объектов, производит запись её в файл. Во время второго прохода, кодек начинает обрабатывать фильм снова. Только он уже производит сжатие исходного материала, пользуясь статистикой от первого прохода. При этом, для каждого кадра выделяется нужный ему битрейт. Таким образом происходит повышение качества кодируемого материала.
Кодеки MPEG-совместимые
MPEG (Moving Pictures Experts Group) — это название экспертной группы ISO (International Standards Organization), которая работает над созданием стандартов кодирования и сжатия видео- и аудио- данных. Стандарты, подготовленные комитетом, получают такое же название.
MPEG-1 был разработан в 1992 году для компрессии видео на CD-ROM и лег в основу Video-CD. На сегодняшний день безбожно устарел. Кодировать им не имеет никакого смысла. Единственное достоинство - низкие требования к аппаратной части.
В стандарте MPEG-2 по сравнению с MPEG-1 добавлен многоканальный звук, увеличено разрешение изображения, улучшено качество кодирования. В результате, MPEG-2 получил широкое распространение в спутниковом телевещании и индустрии DVD.
MPEG-4 - cогласно официальному описанию, является "стандартом аудио-визуального кодирования с очень низким битрейтом". Многие стандарты, разработанные группой MPEG, были приняты организацией ISO (International Standards Organisation), и поэтому они называются ISO-стандартами. MPEG-4 стандарт разделён на множество разных под-стандартов, из которых наибольший интерес представляют следующие:
ISO 14496-1 (Системы), формат контейнера MP4, анимация/интерактивность (например, DVD меню)
ISO 14496-2 (Видео #1), Продвинутый Простой Профайл (Advanced Simple Profile – ASP), которому соответствуют XviD, DivX5, 3ivx...
ISO 14496-3 (Аудио), Продвинутое Кодирование Аудио (Advanced Audio Coding – AAC)
ISO 14496-10 (Видео #2), Продвинутое Кодирование Видео (Advanced Video Coding – AVC), так же известное как H.264 (этому стандарту соответствует кодек x264).
Короче, MPEG-4 - это стандарт видеокомпрессии, специально разработанный для получения очень высокой степени сжатия стандартного видео. Под стандартным понимается видео, отражающее реальный мир. НЕ анимация, мультфильмы и т.п. (Это является одной из причин, почему анимационное видео так сложно зажать; MPEG-4 не разрабатывался для этого).
MPEG-4 стал полноценным MPEG-стандартом в 1998, и был принят ISO в 2001. Технический обзор стандарта MPEG-4 можно найти тут (англ.)
Приложения, работающие с MPEG-4, представлены как програмно, так и аппаратно. "Програмно" означает какую-либо кодирующую или декодирующую программу, аппаратные же устройства обычно представляют собой электронные чипы, специально разработанные для кодирование и/или декодирования MPEG-4.
MPEG-4 решения в виде стационарных аппаратных плееров (таких как DVD-плееры с возможностью проигрывания DivX), обычно на самом деле не являются полностью аппаратными устройствами, а чем-то вроде "полуаппаратных". Они загружают из флэш-памяти (называемой Eeprom) в центральный процессор устройства программу, которая и декодирует файл на диске. Программа, находящаяся в Eeprom, называется прошивкой (firmware), и может быть обновлена для лучшей поддержки других MPEG-4 файлов, а не только DivX.
Типичными MPEG-4 кодеками являются DivX, 3ivx, Quicktime MPEG-4 и, конечно, XviD. И хотя все они MPEG-4 совместимые, это совсем не обязательно означает, что они смогут проигрывать файлы друг друга идеально. Некоторые из них имеют свои фичи, которые другие обрабатывать не умеют, что может иногда приводить к каким-либо глюкам изображения. Если же во время кодирования эти фичи не использовались, видео обладает очень высокой совместимостью.
Кодеки DivX
Разрабатывается компанией DivX Networks, Inc. Первой появилась версия кодека 3.11. Из себя она представляет взломанный и немного измененный кодек "MPEG-4 Version 3" от Microsoft. Эта версия не соответствует стандарту Mpeg4. Затем появился кодек DivX 5, уже соответствующий спецификации Mpeg4 часть 2. Наиболее стабильной является версия кодека DivX 5.2.1.
Среди новшеств кодека DivX 5 появились:
Общая компенсация движения. Помогает при увеличении («наезде» камеры) и при панорамировании (повороте камеры), если объект сохраняет свою статичность и меняется лишь в размере или местоположении на картинке. Включение GMC разумно при кодировании фильмов о природе и подобных.
Четверти пикселей. Влияют на точность фильтрации макроблоков. DivX 4 работает с половинами пикселей (1.5, 1.5), а в DivX 5 возможны варианты типа 1.25, 1.75 и т.д. Обычно деление изображения на макроблоки производится на основе целых (16x16 или 8x8), используя дополнительную информацию из так называемых виртуальных блоков. Это позволяет более реалистично передавать движение объектов на изображении.
Недавно вышла версия кодека DivX 6, которую можно скачать с официального сайта. В этой версии добавилась поддержка нового формата контейнера .divx, однако в плане улучшения качества кодирования никаких особых изменений не произошло.
Кодеки Xvid
Также соответствует стандарту Mpeg4 часть 2. Но, в отличие от DivX, является open source, т.е. любой желающий может скачать его исходники и внести свой вклад в развитие кодека. Это его как достоинство, так и недостаток. Дело в том, что в результате различных изменений, вносимых разными програмистами, разные версии кодека были не совместимы между собой. Поэтому вместе с фильмом приходилось записывать на диск и ту версию кодека, которым он зажат.
Но это утверждение было справедливо раньше, когда кодек длительное время находился в состоянии бета-тестирования. Сейчас, после выхода стабильной версии 1.0, кодек является абсолютно совместимым со стандартом Mpeg, и поэтому фильм, зажатый кодером XviD, может декодироваться, например, декодером DivX.
Как и DivX, XviD поддерживает B-кадры, GMC (общую компенсацию движения) и QP (четверти пикселей). В результате длительной работы над ним большого количества людей, субъективно даёт более высокое качество изображения по сравнению с DivX 5 или 6. Подробнее о настройках кодека XviD см. тут.
Кодеки AVC (H.264)
Соответствуют стандарту MPEG-4 часть 10. Дают потрясающее качество зажатого видео, но и требуют еще больших системных ресурсов для кодирования. В последнее время несколько компаний представили свои разработки кодеков по стандарту H.264. Среди них Fraunhofer IIS, Ateme, Videosoft, MainConcept AG и др. Сравнение различных H.264 кодеков можно найти на сайте Compression.ru. Существует также Open source вариант кодека H.264 под названием x264, имеющий VfW-интерфейс, и поддерживающий двухпроходнее кодирование. Кодек H.264 основан на совершенно другом принципе, по сравнению со всеми предыдущими кодеками. При очень малом битрейте можно получить очень приемлемую картинку.
По крайней мере теоретически, кодеки AVC разных разработчиков должны быть совместимы между собой. Например, я использую для зажатия видео кодер x264, а для просмотра декодер от Videosoft для avi-файлов и декодер Nero Digital для mp4-файлов. Также для просмотра H.264 видео можно использовать DirectShow декодер от группы Core.
Кодеки, несовместимые со стандартами MPEG
Кодек VP6
Разработан фирмой On2. VP6 - это кодек нового поколения, основанный на иных методах сжатия изображения, чем Mpeg4. Он несовместим с Mpeg4, но по качеству выходного изображения на любых битрейтах выигрывает у DivX'а любой версии. Разработчики позволили пользователю самому настраивать ряд параметров, чему стоит только порадоваться (на данный момент только XviD и x264 позволяет столь детально копаться в настройках кодирования).
При инсталляции кодек ставит три профиля - VP60 (simple profile) и VP61 (advanced profile) и VP62 (heightened sharpness profile). Авторы кодека рекомендуют использовать VP60 для обычных и высоких битрейтов, а VP61 - для низких и очень низких битрейтов. VP62 - субверсия кодека VP6, и отличается от VP61 и VP60 качеством (в лучшую сторону, конечно). VP62 требует при кодировании и декодировании больше ресурсов, но способен дать немного лучшее качество кодирования.
К минусам этого кодека можно отнести небольшие недоработки в блоке контроля движения, а также требование достаточно высоких вычислительных ресурсов для кодирования.
Кодек поддерживает двухпроходное кодирование, кодирование в режиме реального времени, позволяет устанавливать постоянный (CBR) или переменный (VBR) битрейд. VP6 - лучший кодек, работающий в области низких битрейтов, по обработке чересстрочного видео. Декодер VP6 имеет встроенный механизм деинтерлейсинга, пусть и не такой мощный, как, например, адаптивный деинтерлейсинг у программного обеспечения ATI, но достаточно неплохой. Кодек имеет встроенную систему шумоподавления.
Недавно вышла следующая версия кодека - VP7, но она ОЧЕНЬ медленно работает, поэтому практическое применение на сегодняшний день под вопросом.
Кодек Windows Media Video
Кодек Real Video
Кодек XviD
На сегодняшний день XviD является самым лучшим ASP-видеокодеком по соотношению Качество/Скорость кодирования. Это не продукт какой-либо компании, а проект с открытым кодом, над которым работает большое количество людей по всему миру. Ядро кодека хорошо портируется на разные операционные системы:
Win32 (MSVC, cygwin, mingw)
GNU/Linux x86/ppc/sparc/ia64
MacOS X
*BSD
Solaris 8 Ultra Sparc
BeOS
XviD - это MPEG4-совместимый видеокодек. Он кодирует видеофайл в MPEG4-совместимый поток данных, который можно сохранить в файл-контейнер, напр. .avi, .ogm, .mp4 или др. Сам по себе он кодировать не может, ему нужна программа, которая бы передавале ему данные для обработки. В качестве примера таких программ можно привести VirtualDub или VirtualDubMod, FlaskMPEG и т.д. Декодирующая часть обычно идет встроенной в кодер, в полном соответствии с термином "кодек" (КОдер/ДЕКодер). Но есть и отдельные декодеры. Они могут только проигрывать файлы, но не кодировать их. Наиболее известен из таких Nic's декодер. При помощи него Вы можете проигрывать Xvid-видео при помощи любого медиа плеера, напр. Windows Media Player, Crystal Player и т.п.
XviD распространяется по лицензии GNU General Public License. Это означает, что любой может скачать его исходный код, использовать его и вносить любые необходимые изменения, при условии затем выпустить свой продукт на тех же условиях
Кодек x264
AVC/H.264 – это часть MPEG-4 стандарта, определяющая один из самых современных и технически совершенных форматов видео кодирования. Он был совместно завершён и специфицирован в 2003 году двумя группами: MPEG из Интернациональной Организации Стандартизации (ISO) и VCEG из Интернационального Телекоммуникационного Союза (ITU) Организации Объединённых Наций (UNO). AVC/H.264 стандарт был разработан Joint Video Team (JVT), которая включает экспертов из MPEG и VCEG. Со стороны MPEG, стандарт называется MPEG-4 Часть 10 (ISO 14496-10), а со стороны ITU – H.264. Под этим названием формат уже широко известен.
С выходом спецификации H.264 многие компании начали разрабатывать свои версии видеокодеков по этому стандарту. У всех этих кодеков есть по крайней мере один серьезный недостаток - их лицензионность, и, как следствие, небесплатность. Исключением является кодек x264, который начал развиваться как проект с открытым исходным кодом (open source). Над ним работает большое количество квалифицированных специалистов со всего мира, периодически выпуская обновления, исправляющие баги, увеличивающие скорость кодирования за счет оптимизации алгоритма, добавляя новые фичи. На сегодняшний день x264 является наилучшим среди AVC-кодеков по соотношению качество/скорость кодирования.
Однако, правильнее будет называть x264 не кодеком, а кодером, т.к. он не включает в себя декодера для проигрывания зажатого видеоматериала. Для просмотра видео, зажатого x264, придется установить декодер стороннего производителя. Так, например, для проигрывания AVC-видео, находящегося в контейнерах AVI или Matroska можно использовать декодер от VSS, либо ffdshow. А для контейнера MP4 лучше использовать декодер Nero Digital, устанавливающийся вместе с пакетом Nero Vision Express.
Версии кодека x264 выходят двух разновидностей:
VFW (Video for Windows)
CLI (Command line Interface)
Первая представляет собой привычный вариант кодека, устанавливаемый в систему, и доступный для большинства программ для кодирования видео (VirtualDub, FlaskMPEG, GordianKnot и т.п.).
Вторая представляет собой .exe-файл, запускаемый с определенными параметрами (местоположение исходного видео, параметры кодирования, имя выходного файла и т.п.), и дающий на выходе видеофайл в контейнере mp4.
В данной статье будут рассмотрены настройки кодека x264 в версии VFW. Для изучения настроек CLI версии кодека можете обратиться к статье, описывающей работу с MeGUI.