Раскладка первых шести байт фрейма:
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, то здесь уже начинаются аудио данные |
MPEG 1 | MPEG 2 | |||||||||||||||||
|
|
MPEG 1 | MPEG 2 | |||||
|
|
Layer 1,2 | Layer 3 | |||||
|
|
Считаем длину фрейма:
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)
Считаем время звучания и средний битрейт в случае VBR:
PlayTimeSec = (int) (1152 / SampleRate * vbrFrames);
BitRate = (int) (DataSize / PlayTimeSec * 8 / 1000);
Frames = число фреймов, если установлен 0-й бит флажков
DataSize = размер MP3-потока (безо всяких тагов и
RIFF-хеадеров)