Из чего сделаны *.mp3 файлы? В русскоязычном Интернете я не нашёл достаточно информации по этому вопросу. Поэтому здесь я решил описать формат заголовка mpeg фрейма. Данная спецификация предназначена, прежде всего, в помощь разработчикам программного обеспечения. Надеюсь, после её прочтения у программиста не будет появляться проблем в этом вопросе.
Итак, цифровой звук поделён на маленькие части, и закодирован в соответствии с психоакустической моделью. Эти части, называемые «фреймами», представляют собой некий наименьший объём аудиоданных, которые в последствие можно каким-либо образом обрабатывать. В самом начале фрейма, непосредственно перед аудиоданными, находится «заголовок фрейма». Об этих заголовках и пойдёт речь далее. Так как фреймы не зависят друг от друга, то каждый фрейм имеет собственный заголовок, который может отличаться от остальных. Очень часто перед фреймами и после них размещают некоторую дополнительную информацию. Например, практически у любого *.mp3 файла, произведённого более-менее добросовестными компаниями, после фреймов, в самом конце файла, находится тег ID3v1. Как известно многим, этот тег содержит информацию о названии композиции, её авторе, стиле и так далее. Перед фреймами может находиться, например, заголовок *.wav файла либо тег ID3v2, который является более совершенной разработкой тегов ID3v1 и позволяет включать в музыкальный файл практически любую информацию вплоть до текста песни или фотографии обложки альбома диска.
Теоретически, «лишняя» информация может находиться в любом месте аудиофайла между фреймами, но, по-моему, это не слишком гуманный и удобный способ для её размещения, разве что если мы не хотим специально спрятать эту информацию от посторонних глаз.
Часто, формат всех аудиоданных файла можно определить по заголовку его первого фрейма, если мы не имеем дело с различными заголовками фреймов. Таковыми, например, являются фреймы файлов с переменной скоростью сжатия (variable bitrate – VBR). В этом случае, если не использовать специальных алгоритмов, для определения различных параметров файла (та же скорость) необходимо просматривать заголовки всех фреймов, составляющих файл.
Заголовок фрейма состоит из 4 байт. Начало фрейма – это, так называемая «область синхронизации». Согласно стандарту MPEG, эта область должна состоять из 12 установленных бит. Однако, некоторые дополнительные стандарты, созданные позже, используют для синхронизации 11 установленных и 1 сброшенный бит (см. примечание).
Сразу за областью синхронизации следует бит идентификации, определяющий версию MPEG. Значение бита 0 – MPEG-2, значение бита 1 – MPEG-1.
Следующие два бита определяют подверсию MPEG (или MPEG Layer). Их значения перечислены в таблице:
0 0 | Не определено (возможно, файл повреждён) |
0 1 | Layer III |
1 0 | Layer II |
1 1 | Layer 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 1 | 32 | 32 | 32 | 32 | 32 | 8 |
0 0 1 0 | 64 | 48 | 40 | 64 | 48 | 16 |
0 0 1 1 | 96 | 56 | 48 | 96 | 56 | 24 |
0 1 0 0 | 128 | 64 | 56 | 128 | 64 | 32 |
0 1 0 1 | 160 | 80 | 64 | 160 | 80 | 64 |
0 1 1 0 | 192 | 96 | 80 | 192 | 96 | 80 |
0 1 1 1 | 224 | 112 | 96 | 224 | 112 | 56 |
1 0 0 0 | 256 | 128 | 112 | 256 | 128 | 64 |
1 0 0 1 | 288 | 160 | 128 | 288 | 160 | 128 |
1 0 1 0 | 320 | 192 | 160 | 320 | 192 | 160 |
1 0 1 1 | 352 | 224 | 192 | 352 | 224 | 112 |
1 1 0 0 | 384 | 256 | 224 | 384 | 256 | 128 |
1 1 0 1 | 416 | 320 | 256 | 416 | 320 | 256 |
1 1 1 0 | 448 | 384 | 320 | 448 | 384 | 320 |
1 1 1 1 | НЕ ОПРЕДЕЛЕНО (возможно, файл повреждён) |
Частота дискретизации (в Герцах) описана в 2-битовом поле «частота». Её числовое значение зависит от используемого стандарта MPEG:
Значение поля | MPEG-1 | MPEG-2 |
---|---|---|
0 0 | 44100 Гц | 22050 Гц |
0 1 | 48000 Гц | 24000 Гц |
1 0 | 32000 Гц | 16000 Гц |
1 1 | НЕ ОПРЕДЕЛЕНО |
Далее следует бит выравнивания. Если его значение 0, то фрейм не использует выравнивающий блок. Если значение 1, то использует. Выравнивающий блок для MPEG Layer I составляет 4 байта, для MPEG Layer II и MPEG Layer I – 1 байт.
Следующий бит – бит Private. Он напрямую не используется в процессе декодирования, так же как и биты: Авторское право (Copyright), и Оригинальный носитель (Home или Original). Эти три бита носят чисто вспомогательный характер, и их значение может не соответствовать действительности, так как практически любой мало-мальски приличный звуковой редактор (не говоря даже о таких звуковых монстрах, как CoolEdit) может установить либо сбросить эти биты. Да и любой программист после прочтения данного руководства сможет это сделать, так как ему будут известны положения этих флагов в заголовке фрейма.
После бита Private следует двухбайтное поле стереорежима.
Значение поля | Стереорежим |
---|---|
0 0 | Stereo |
0 1 | Joint stereo |
1 0 | Dual channel |
1 1 | Mono |
Следующие 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 1 | 50/15 мс |
1 0 | Зарезервировано |
1 1 | CCITT 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-2.5. В связи с добавлением новой версии в некоторые поля внесены изменения.
Итак, область синхронизации занимает не 12, а 11 бит, заполненных единицами.
Поле версии MPEG соответственно занимает не 1, а 2 бита:
Значение поля | Версия MPEG |
---|---|
0 0 | MPEG Version 2.5 |
0 1 | Недопустимое значение (возможно, файл повреждён) |
1 0 | MPEG Version 2 |
1 1 | MPEG Version 1 |
При определении скорости сжатия потока (bitrate) для MPEG-2.5 используют те же значения, что и для MPEG-2.
Поле частоты дискретизации также интерпретируется с изменениями:
Значение поля | MPEG-1 | MPEG-2 | MPEG-2.5 |
---|---|---|---|
0 0 | 44100 Гц | 22050 Гц | 11025 Гц |
0 1 | 48000 Гц | 24000 Гц | 12000 Гц |
1 0 | 32000 Гц | 16000 Гц | 8000 Гц |
1 1 | НЕ ОПРЕДЕЛЕНО |