Заголовок фрейма MPEG

Из чего сделаны *.mp3 файлы? В русскоязычном Интернете я не нашёл достаточно информации по этому вопросу. Поэтому здесь я решил описать формат заголовка mpeg фрейма. Данная спецификация предназначена, прежде всего, в помощь разработчикам программного обеспечения. Надеюсь, после её прочтения у программиста не будет появляться проблем в этом вопросе.

Итак, цифровой звук поделён на маленькие части, и закодирован в соответствии с психоакустической моделью. Эти части, называемые «фреймами», представляют собой некий наименьший объём аудиоданных, которые в последствие можно каким-либо образом обрабатывать. В самом начале фрейма, непосредственно перед аудиоданными, находится «заголовок фрейма». Об этих заголовках и пойдёт речь далее. Так как фреймы не зависят друг от друга, то каждый фрейм имеет собственный заголовок, который может отличаться от остальных. Очень часто перед фреймами и после них размещают некоторую дополнительную информацию. Например, практически у любого *.mp3 файла, произведённого более-менее добросовестными компаниями, после фреймов, в самом конце файла, находится тег ID3v1. Как известно многим, этот тег содержит информацию о названии композиции, её авторе, стиле и так далее. Перед фреймами может находиться, например, заголовок *.wav файла либо тег ID3v2, который является более совершенной разработкой тегов ID3v1 и позволяет включать в музыкальный файл практически любую информацию вплоть до текста песни или фотографии обложки альбома диска.

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

Часто, формат всех аудиоданных файла можно определить по заголовку его первого фрейма, если мы не имеем дело с различными заголовками фреймов. Таковыми, например, являются фреймы файлов с переменной скоростью сжатия (variable bitrateVBR). В этом случае, если не использовать специальных алгоритмов, для определения различных параметров файла (та же скорость) необходимо просматривать заголовки всех фреймов, составляющих файл.

Заголовок фрейма состоит из 4 байт. Начало фрейма – это, так называемая «область синхронизации». Согласно стандарту MPEG, эта область должна состоять из 12 установленных бит. Однако, некоторые дополнительные стандарты, созданные позже, используют для синхронизации 11 установленных и 1 сброшенный бит (см. примечание).

Сразу за областью синхронизации следует бит идентификации, определяющий версию MPEG. Значение бита 0 – MPEG-2, значение бита 1 – MPEG-1.

Следующие два бита определяют подверсию MPEG (или MPEG Layer). Их значения перечислены в таблице:
0 0Не определено (возможно, файл повреждён)
0 1Layer III
1 0Layer II
1 1Layer I

Далее следует бит контрольной суммы. Если он НЕ установлен, то после заголовка фрейма будет следовать 16-разрядная контрольная сумма, вставленная до аудиоданных.

Следующие 4 бита определяют скорость сжатия потока данных (или bitrate). Все значения сведены в таблицу:
Значение
поля
MPEG-1,
layer I
MPEG-1,
layer II
MPEG-1,
layer III
MPEG-2,
layer I
MPEG-2,
layer II
MPEG-2,
layer III
0 0 0 0НЕ ОПРЕДЕЛЕНО
0 0 0 132323232328
0 0 1 0644840644816
0 0 1 1965648965624
0 1 0 012864561286432
0 1 0 116080641608064
0 1 1 019296801929680
0 1 1 12241129622411256
1 0 0 025612811225612864
1 0 0 1288160128288160128
1 0 1 0320192160320192160
1 0 1 1352224192352224112
1 1 0 0384256224384256128
1 1 0 1416320256416320256
1 1 1 0448384320448384320
1 1 1 1НЕ ОПРЕДЕЛЕНО (возможно, файл повреждён)
Значение 0000 означает, что скорость сжатия определяется приложением в процессе работы над аудиоданными, то есть определить её заранее невозможно.

Частота дискретизации (в Герцах) описана в 2-битовом поле «частота». Её числовое значение зависит от используемого стандарта MPEG:
Значение поляMPEG-1MPEG-2
0 044100 Гц22050 Гц
0 148000 Гц24000 Гц
1 032000 Гц16000 Гц
1 1НЕ ОПРЕДЕЛЕНО

Далее следует бит выравнивания. Если его значение 0, то фрейм не использует выравнивающий блок. Если значение 1, то использует. Выравнивающий блок для MPEG Layer I составляет 4 байта, для MPEG Layer II и MPEG Layer I – 1 байт.

Следующий бит – бит Private. Он напрямую не используется в процессе декодирования, так же как и биты: Авторское право (Copyright), и Оригинальный носитель (Home или Original). Эти три бита носят чисто вспомогательный характер, и их значение может не соответствовать действительности, так как практически любой мало-мальски приличный звуковой редактор (не говоря даже о таких звуковых монстрах, как CoolEdit) может установить либо сбросить эти биты. Да и любой программист после прочтения данного руководства сможет это сделать, так как ему будут известны положения этих флагов в заголовке фрейма.

После бита Private следует двухбайтное поле стереорежима.
Значение поляСтереорежим
0 0Stereo
0 1Joint stereo
1 0Dual channel
1 1Mono

Следующие 2 бита составляют поле расширения стереорежима. Это поле имеет смысл только для Joint Stereo (см. предыдущее поле).
Значение поля Layer II и Layer II Layer III
Intensity stereo MS stereo
00 Полосы 4–31 Нет Нет
01 Полосы 8–31 Да Нет
10 Полосы 12–31 Нет Да
11 Полосы 16–31 Да Да

Далее следуют биты Copyright и Original/Home. Их назначение рассмотрено выше.

И, наконец, последнее поле заголовка фрейма. Это поле Emphasis. Эмфаза (англ. выразительность, сила, ударение) используется для некоторой переэквализации звука (выравнивание по частотам) после того, как он обработан схемами шумоподавления (например Dolby). Это не очень часто используемое поле. Во многих случаях оно может и не понадобиться вообще. В следующей таблице перечислены используемые модели шумоподавления:
Значение поляМетод Emphasis
0 0Нет
0 150/15 мс
1 0Зарезервировано
1 1CCITT j.17

В заключение приведу описание структуры для заголовка MPEG. Данный пример использует стандартную структуру языка Си: битовое поле.
typedef struct _MPEG_Header
{
    int Sync     : 12;
    int ID       : 1;
    int Layer    : 2;
    int CRC      : 1;
    int Bitrate  : 4;
    int Freq     : 2;
    int Padding  : 1;
    int Private  : 1;
    int Stereo   : 2;
    int StereoEx : 2;
    int Copy     : 1;
    int Original : 1;
    int Emphasis : 2;
} MPEG_Header, *p_MPEG_Header;
Заголовок фрейма MPEG


Примечание

Существует неофициальный формат для файлов с сильным сжатием, известный под названием MPEG-2.5. В связи с добавлением новой версии в некоторые поля внесены изменения.

Итак, область синхронизации занимает не 12, а 11 бит, заполненных единицами.

Поле версии MPEG соответственно занимает не 1, а 2 бита:
Значение поляВерсия MPEG
0 0MPEG Version 2.5
0 1Недопустимое значение (возможно, файл повреждён)
1 0MPEG Version 2
1 1MPEG Version 1

При определении скорости сжатия потока (bitrate) для MPEG-2.5 используют те же значения, что и для MPEG-2.

Поле частоты дискретизации также интерпретируется с изменениями:
Значение поляMPEG-1MPEG-2MPEG-2.5
0 044100 Гц22050 Гц11025 Гц
0 148000 Гц24000 Гц12000 Гц
1 032000 Гц16000 Гц8000 Гц
1 1НЕ ОПРЕДЕЛЕНО


© Максименко Ал 04.06.2005
Последнее обновление: 14.07.2006