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


Раскладка первых шести байт фрейма:

Byte 0
7
6
5
4
3
2
1
0
Byte 1
7
6
5
Заголовок синхронизации
(Sync Header)
все биты равны 1
4
3
00 = MPEG 2.5
01 = MPEG ?
10 = MPEG 2.0
11 = MPEG 1.0
2
1
00 = Layer ?
01 = Layer 3
10 = Layer 2
11 = Layer 1
0 0 = Error Protection Bit - CRC is ON
1 = Error Protection Bit - CRC is OFF
Byte 2
7
6
5
4
Bit rate
см. таблицу
3
2
Sample rate
см. таблицу
1 0 = Unused bits are filled (padding req.)
1 = All bits in frame are used
0 0 = Extension None
1 = Extension Private
Byte 3
7
6
00 = Stereo
01 = Joint Stereo
10 = Dual Channel
11 = Single Channel (Mono)
5
4
Mode extension
см. таблицу
3 0 = Copyright NO
1 = Copyright YES
2 0 = Original NO
1 = Original YES
1
0
00 = Emphasis None
01 = Emphasis 50/15 microseconds
10 = Emphasis Dunno
11 = Emphasis CITT j.17
Byte 4
Byte 5
CRC 16
Если Error Protection Bit = 0, то здесь находится контрольнаясумма
Если Error Protection Bit = 1, то здесь уже начинаются аудио данные

Таблица BIT RATE

MPEG 1   MPEG 2
  Layer 1 Layer 2 Layer 3
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
  0
 32
 64
 96
128
160
192
224
256
288
320
352
384
416
448
???
  0
 32
 48
 56
 64
 80
 96
112
128
160
192
224
256
320
384
???
  0
 32
 40
 48
 56
 64
 80
 96
112
128
160
192
224
256
320
???
 
  Layer 1 Layer 2 Layer 3
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
  0
 32
 48
 56
 64
 80
 96
112
128
144
160
176
192
224
256
???
  0
  8
 16
 24
 32
 40
 48
 56
 64
 80
 96
112
128
144
160
???
  0
  8
 16
 24
 32
 40
 48
 56
 64
 80
 96
112
128
144
160
???

Таблица SAMPLE RATE

MPEG 1   MPEG 2
00
01
10
11
44100
48000
32000
Stream error
 
00
01
10
11
44100
48000
32000
Stream error

Таблица MODE EXTENSION

Layer 1,2   Layer 3
00
01
10
11
 4
 8
12
16
 
00
01
10
11
 0
 4
 8
16

Считаем длину фрейма:

FrameSize = (int) (SlotsPerFrame * (BitRate * 1000 / 8) / SampleRate + Padding)
SlotsPerFrame = 384 для Layer 1
SlotsPerFrame = 1152 для Layer 2,3
DataSize = размер MP3-потока (безо всяких тагов и RIFF-хеадеров)

Считаем время звучания в секундах:

PlayTimeSec = (int) (DataSize / (BitRate * 1000 / 8))
DataSize = размер MP3-потока (безо всяких тагов и RIFF-хеадеров)

Определяем Variable Bit Rate:  (спасибо Alexander Trunov, 2:5069/10)

  1. лезем по смещению 36 от начала заголовка первого фрейма и считываем 4 байта, если там записана сигнатура 'Xing', то мы имеем файл с VBR
  2. считываем 4 байта флажков
  3. если установлен 0-й бит флажков, то считываем 4-байтное число фреймов
  4. если установлен 1-й бит флажков, то считываем 4-байтный размер MP3-потока
  5. если установлен 2-й бит флажков, то считываем 100-байтную таблицу неизвестного назначения
  6. если установлен 3-й бит флажков, то считываем 4-байтный предел изменений битрейта
Следует отметить, что все числа записываются начиная со старшего байта (а не с младшего, как обычно).

Считаем время звучания и средний битрейт в случае VBR:

PlayTimeSec = (int) (1152 / SampleRate * vbrFrames);
BitRate = (int) (DataSize / PlayTimeSec * 8 / 1000);
Frames = число фреймов, если установлен 0-й бит флажков
DataSize = размер MP3-потока (безо всяких тагов и RIFF-хеадеров)


Написать мне письмо
mailto:cat@amilen.spb.ru