img13 ноября 2009 в 22:34

Кодеки, контейнеры, форматы для начинающих

Кодеки, контейнеры, форматы, битрейты.. Масса путающихся терминов и обозначений, куча параметров, в которых приходится разбираться и конечным пользователям, не понимающим, почему у них не проигрывается видео из Интернета или с диска, и контент-провайдерам, определяющим, как подготовить файлы так, чтобы их получили и смогли посмотреть максимальное количество пользователей. Неужели нельзя, наконец, выбрать какой-то один вариант, устраивающий всех, и больше не мучиться никогда? Давайте попробуем разобраться.

Кодеки, контейнеры, форматы, битрейты.. Масса путающихся терминов и обозначений, куча параметров, в которых приходится разбираться и конечным пользователям, не понимающим, почему у них не проигрывается видео из Интернета или с диска, и контент-провайдерам, определяющим, как подготовить файлы так, чтобы их получили и смогли посмотреть максимальное количество пользователей. Неужели нельзя, наконец, выбрать какой-то один вариант, устраивающий всех, и больше не мучиться никогда? Давайте попробуем разобраться.

Кодеки, контейнеры, форматы, битрейты.. Масса путающихся терминов и обозначений, куча параметров, в которых приходится разбираться и конечным пользователям, не понимающим, почему у них не проигрывается видео из Интернета или с диска, и контент-провайдерам, определяющим, как подготовить файлы так, чтобы их получили и смогли посмотреть максимальное количество пользователей. Неужели нельзя, наконец, выбрать какой-то один вариант, устраивающий всех, и больше не мучиться никогда? Давайте попробуем разобраться.

Во время съемки видео на цифровую камеру прямо при записи происходит оцифровка изображения и отбрасывание части информации - например, того, что человеческий глаз все равно не увидит. То есть определенное сжатие происходит практически сразу. Профессиональные камеры пишут поток видео с битрейтом от 50 Мбит/c. Например, при съемке на камеру Panasonic в формате DVCproHD битрейт составляет 100 Мбит/с, и 10 минут видео займет места порядка 7 Гбайт. Этот объем информации потом пригодится для монтажа, но "впихнуть" такой поток в каналы эфирного или кабельного ТВ без дополнительного сжатия (кодирования) не получится. При съемке на обычную бытовую камеру информации отбрасывается побольше - например, DV-камера записывает со скоростью порядка 25 Мбит/с, но все равно без дополнительного сжатия на DVD-болванку получится записать около 20 минут видео, а вовсе не 4 фильма по 2 часа.

Хранить записанные видеоматериалы - будь это домашнее видео или архив телекомпании - лучше всего в исходном формате. А вот для распространения видео придется дополнительно сжимать - кодировать. Для этого разрабатываются разнообразные математические алгоритмы сжатия и соответствующие устройства или программы, которые в соответствии с этими алгоритмами сжимают видео (кодеры), а потом на том устройстве, на котором происходит, например, просмотр, разжимают его (декодеры). Чаще всего кодирование занимает больше времени и ресурсов, кадр просматривается и пересчитывается несколько раз, зато декодирование - процесс, который должен происходить "на лету", обычно в десятки раз быстрее кодирования. Кодек H.264 устроен еще более "несимметрично" - в нем жестко не определен процесс кодирования, зато стандартизирован процесс декодирования. Компании-производители могут придумывать свои собственные способы кодирования видеосигнала; главное, чтобы стандартный декодер смог потом с ним справиться. В результате один и тот же по названию кодек H.264, реализованный разными компаниями, будет давать разную картинку.

Существуют кодеры, которые не сжимают видео, а только преобразуют его в другой вид/формат файла - например, для хранения файла на специфическом носителе. Этот вариант называется lossless - без потери качества.

Технологии кодирования

По способу обработки изображения кодеки делятся на две группы. Можно сжимать видео покадрово - когда каждая картинка-фрейм обрабатывается отдельно (intra-frame compression). Такое кодирование применяется, если видеоматериал в дальнейшем планируется монтировать и редактировать. Примеры таких кодеков - DV, MPEG2 (IMX), AVC-Intra, JPEG-2000, Avid DNxHD

Существует несколько вариантов отбрасывания "лишней" информации внутри кадра. Известно, например, что человеческий глаз хорошо различает оттенки яркости, а вот оттенки цвета видит хуже. Поэтому информацию о яркости можно хранить для каждой точки кадра, а по цветности - через одну (из кадра 4.4.4. получится кадр 4.2.0 -это преобразование понятно описано на codec.ru и подробнее в Википедии). Можно разбить цвет на меньшее количество уровней и хранить информацию о цвете не в 10, а в 8 битах. Можно отказаться от высокочастотных изменений цвета. (Подробно прочитать о том, какие бывают математические методы и алгоритмы сжатия для статических графических изображений и видео можно в книге Методы сжатия данных)

Если видеоматериал предполагается не редактировать, а распространять по "узким" каналам связи, используются технологии сравнения кадров между собой и хранения информации об изменении между кадрами (inter-frame compression). При этом целиком передаются только отдельные кадры (i-фреймы), а для остальных передаются описание изменений по сравнению с i-фреймами. Примеры таких кодеков - H.264, VP6, WMV, MPEG-2 LongGOP.

MPEG-2 LongGOP - это, кстати, кодек, который используется в большинстве проектов спутникового ТВ.

Профили и уровни

Одни и те же алгоритмы кодирования с разным набором параметров дадут на выходе сигнал с разной степенью сжатия и качества. Кроме того, в зависимости от времени, которое есть у кодера на обработку изображения, можно воспользоваться дополнительными алгоритмами или сделать кодирование в несколько проходов (multi-pass), тогда даже с тем же битрейтом качество изображения будет лучше. Но и декодирование в этом случае может оказаться более сложным, так что у декодирующего устройства может попросту не хватать мощности или памяти.

Таким образом, при кодировании приходится постоянно иметь в виду и ширину канала, по которому сигнал нужно будет распространять, и ресурсы декодируюшего устройства. Чтобы производители кодеров и декодеров могли договориться, у кодеков есть дополнительные характеристики - профиль, определяющий применяемые технологии сжатия, и уровни, характеризующие степень сжатия, то есть размер кадра и битрейт. Например, для того же самого кодека H.264 существует множество вариантов профилей (см подробнее), для видео в Интернете обычно используется Baseline Profile (BP) для более слабых устройств и MP (Main Profile) для обычных современных компьютеров. Соответственно, производители кодеров H.264 должны заранее продумать, какие устройства будут потом работать с видеосигналом и по каким каналам он будет распространяться, и оптимизировать свои решения под эти конкретные применения.

Ряд интересных побочных следствий:
1)Если вы пытаетесь посмотреть видео из Интернета в высоком качестве на полном экране (например, с vimeo.com), канал у вас хороший, а видео показывается рывками, посмотрите на загрузку CPU - может быть, вам пора менять компьютер.
2)Нельзя сравнить качество видео или оценить эффективность кодеков по битрейту получившегося сигнала. По битрейту качество видео в принципе трудно оценить из-за того, что передаваемые биты могут содержать в себе просто шум. Именно поэтому для качественного результата исключительно важно использовать хороший сигнал на входе кодера и проводить дополнительную его обработку для уменьшения шума. Иначе драгоценные ресурсы будут потрачены на кодирование и распространение "мусора". Автоматически анализировать качество видео тоже очень трудно, разрабатываются и патентуются сложные способы оценки качества видеосигнала с помощью системы экспертных оценок. Но даже если мы подадим совершенно одинаковый чистый сигнал на вход нескольких кодеров, может получиться, что на выходе сигнал боле высокого качества имеет более низкий битрейт.
3)А вот тут приводится еще более интересный пример несоответствия битрейта и качества. Видео скачано и перекодировано с уменьшением битрейта в 4 раза, но это не привело к ухудшению изображения - возможно, оно стало даже четче.

Контейнеры

Итак, видео мы закодировали с помощью одного кодека, аудио - с помощью другого, а еще у нас есть субтитры, они в отдельном текстовом файле, или анимация, тоже в отдельном файле. Теперь все это нужно объединить ("завернуть", мультиплексировать) в один общий файл, который называется контейнером. Задача контейнера - правильно синхронизировать заложенный в него разнообразный контент. Ясно, что это непростая задача. Считается, что подавляющее большинство ошибок при проигрывании файлов связано именно с контейнерами. Их примеры - MOV, AVI, MPEG (MPEG-2 TS и MPEG-2 PS), VOB, MKV, WMV, 3GPP, 3G2. Сравнительную таблицу контейнеров можно найти в Википедии.

Мультиплексировать можно по-разному. Если предполагается, например, менять субтитры или добавлять аудио, удобнее, если звук, видео и текст расположены в отдельных файлах, а файл-контейнер содержит только ссылки для их синхронизации (reference file). Если же предполагается просто передавать контент для просмотра конечным пользователем, то контейнер - это, обычно, один файл, в котором подряд положены "нарезанные" кусочки файлов звука, видео, субтитров. По названию догадаться нельзя. Например, контейнер Quicktime MOV поддерживает оба варианта и умеет конвертировать один в другой.

В Интернете часто используются контейнеры, в которых все хранится внутри (self-contained), но, например, потоковое вещание в решении Adobe dynamic streaming предполагает, что видео хранится отдельно от информации о синхронизации, и за счет этого пользователю можно непрерывным потоком отдавать видео с разной степенью сжатия, подстраиваясь под его полосу пропускания.

Контейнеры тоже бывают двух типов - потоковые и файловые, в зависимости от задач.

1) В файловом контейнере вся описательная информация о видео-, аудио- и прочих данных хранится в одном месте (начало или конец файла). Плюс - минимальная избыточность, минус - если описательная информация потеряна, повреждена или еще не получена, то воспроизведение или любая другая обработка файла будет невозможна или крайне затруднена. Если информация о файле хранится в начале, то его можно начать проигрывать или обрабатывать с начала, не дожидаясь полной загрузки файла на компьютер (progressive download).

2) В потоковом контейнере описательная информация постоянно присутствует в потоке данных с определенной периодичностью. Плюс - воспроизведение или обработка данных возможна практически с любого момента, минус - избыточность описательной информации.

Потоковые контейнеры используются, например, при организации цифрового эфирного телевизионного вещания. Для нас естественно, когда телевизор начинает показывать видео почти сразу, а не ждет, когда начнется новая передача или полностью загрузится текущая. Ну, может, видео чуть притормозит, пока телевизор будет ждать получения очередного i-фрейма в потоке. Потоковые контейнеры важны и в профессиональной области, потому что позволяют начать обработку видео: например, транскодирование - с начала получения потока мультимедиа данных, и в результате задержка между, например, трансляцией футбольного матча и его реальным ходом на стадионе будет меньше. Подробно устройство такого широко используемого в телевещании потокого контейнера как MPEG-2 TS описывалось в статье Цифровое кабельное ТВ.

Точно такое же потоковое вещание бывает и через Интернет - например, так обычно устроено в сети радио. Даже если исходно вся программа вещания была составлена из отдельных файлов с видео или аудио, вещательный сервер в соответствии с плей-листом "склеивает" их и выдает одним потоком.

Поток не обязательно должен быть бесконечным и вещаться один для всех. В Интернете это может быть и видео ограниченной длины, которое сервер проигрывает специально для вас. Но поскольку служебная информация присутствует в потоке повсюду, такое видео можно смотреть практически с любого места и проматывать вперед и назад. Считается, что если ролик длиннее 10 минут, его лучше вкладывать в потоковый контейнер. Интернет-вещатели все шире используют потоковые контейнеры, возможно, потому что при потоковом вещании на пользовательском устройстве не создается копии видео, а сохраняется только небольшой его кусочек - буфер, необходимый для равномерного проигрывания; да и на вещательном сервере нет, собственно, файла с видео, который мог бы быть скачан интернет-пиратами.

1)Интересное применение контейнеров - защита вложенной информации. Аудиофайл, например, можно выложить в Интернете и без контейнера - в mp3-файле. Но в такой файл не добавить контроль доступа, поэтому раз скачанный файл будет доступен пользователю на любом устройстве и всегда. Если провайдер хочет ограничить прослушивание, к примеру, несколькими днями, потребуется вложить файл mp3 в контейнер, например, в WMA (Windows Media Video/Audio) вместе с файлами DRM, несущими информацию о правилах доступа.
2)На сайте adobe.com в статье Dynamic streaming on demand with Flash Media Server 3.5 можно найти пример того, как для определенного контейнера связаны вместе кодеки, размер кадра и битрейт для распространенных размеров кадра в случае вещания в Интернете с использованием технологии Adobe dynamic streaming, т.е. кодека H.264 и потокового контейнера F4V

Форматы

И, наконец, формат - это некая совокупность описаний контейнеров, набора кодеков и дополнительных метаданных. Вся структура вместе получается достаточно сложной.

Пример формата и его составляющих, который приводит Rozhet :
M2TS c H.264 (HP) видео и MPEG-1 Layer 2 аудио, например, может соответствовать:
контейнер M2TS
H.264 видеокодек с параметрами:
кадр 720x480, 29.97 fps (кадров в секунду), верхнее поле - первое
 CBR 3Mbps, т.е. кодер выдает сигнал с постоянным битрейтом 3 Мбит/с
High profile, 3,2 Level, ATSC closed-captionning - профиль кодека HP, уровень 3,2, определенный способ вывода текста
... и еще более 50 других параметров
MPEG-1 Layer 2 аудио
Стерео, 16-битное кодироание, частота дискретизации 48кГц
битрейт аудио - 128 кбит/c

А чтобы все неспециалисты совершенно запутались, одни и те же названия часто используются для кодеков, контейнеров и форматов. Поэтому, о чем идет речь в данный момент - о формате или контейнере MPEG-2, и если о контейнере, то о каком из двух, или, может, собеседник подразумевает кодек H.262, применяемый для видео в этом формате, придется догадываться по контексту разговора. А, например, формат MPEG-4 включает описание двух разных видеокодеков - MPEG-4 Part 2 и MPEG-4 Part 10 (он же MPEG-4 AVC, он же H.264). При этом они оба широко применяются. MPEG-4 Part 2 - используется в контейнерах DivX(DivX Media Format) и QuickTime 6; MPEG-4 Part 10, AVC/H.264 - используется при записи HD DVD и Blu-ray дисков, и в QuickTime 7, Flash 9 и др., в том числе и в вещательном ТВ.

Выбор

Как ясно из сказанного выше, для подготовки видеоматериала и для распространения потребуются, скорее всего, разные способы кодирования видео. И даже если речь идет только о распространении видеоролика по сетям с низкой пропускной способностью, для подготовки спортивных трансляций потребуется другое кодирование, отличное от кодирования для видеомедицины. В одном случае нужно обрабатывать быстро двигающиеся изображение, в другом важно сохранить мелкие детали. А, например, для видеоконференцсвязи кодек должен работать быстро - иначе образуются большие задержки при общении. Поэтому при выборе формата/контейнера/кодека нужно точно понимать, для чего он будет использоваться, универсального решения не существует.


Дополнительное чтение и благодарности:

Помимо ссылок, приведенных в тексте, интересные материалы о кодеках, контейнерах и форматах для начинающих можно найти, например, на сайте компании Rhozet в разделе White Papers.

Компания Rhozet продает транскодеры - программы, преобразующие файлы одного формата в другой, и поэтому очень хорошо разбирается во всем, связанном с файловыми контейнерами. При подготовке статьи я также пользовалась материалами доклада, который сделал вице-президент Rhozet David Trescot на вебинаре .

Rhozet - компания, работающая с файловыми контейнерами. Возможно, именно этот факт привел к некоторому перекосу в статье в сторону файловой обработки видео. Специалисты российской компании "Элекард", разрабатывающей кодеки и программы для анализа структуры MPEG-потока, обратили мое внимание на этот перекос, и я очень благодарна Владиславу Марченко за замечания. Надеюсь когда-нибудь вникнуть в особенности потоковых контейнеров более глубоко.

Отдельное большое спасибо за советы и правки Дмитрию Кашину, руководителю отдела контроля качества телекомпании "Первый ТВЧ".

Подписка на рассылку

Подпишитесь на рассылку, чтобы одним из первых быть в курсе новых событий