[링크 : http://en.wikipedia.org/wiki/ID3]
일단 FFFBA040 이라고 아래에서 예를 들지만
mpeg1 - Layer 3냐
mpeg2 - Layer 3냐에 따라서도 조금씩 달라지지만
FFFx 로 시작하는건 "거의" 확실하다는 점
[링크 : http://en.wikipedia.org/wiki/MP3]
[링크 : http://www.datavoyage.com/mpgscript/mpeghdr.htm]
--
96kbps / 44k / 2ch mp3의 덤프
팟인코더로 해서 앞에 ID3 태그에 간략하게 팟 인코더로 나오고 FFFB7064로 프레임당 313 바이트 정도로 나온다.
이유는 모르겠지만.. CBR이라고 해도 313/314로 오락가락하는데 패딩 문제인거 같긴하지만 계산법을 찾아 봐야 할 듯
320kbps / 44k / 2ch mp3의 덤프
FFFBE064 로 프레임당 1044 / 1045 바이트
mp3 헤더 분석 및 프레임 크기 계산
// MPEG versions - use [version] const uint8_t mpeg_versions[4] = { 25, 0, 2, 1 };
// Layers - use [layer] const uint8_t mpeg_layers[4] = { 0, 3, 2, 1 };
// Bitrates - use [version][layer][bitrate] const uint16_t mpeg_bitrates[4][4][16] = { { // Version 2.5 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3 { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2 { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1 }, { // Reserved { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Invalid { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Invalid }, { // Version 2 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 3 { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // Layer 2 { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 } // Layer 1 }, { // Version 1 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Reserved { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 }, // Layer 3 { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // Layer 2 { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // Layer 1 } };
// Sample rates - use [version][srate] const uint16_t mpeg_srates[4][4] = { { 11025, 12000, 8000, 0 }, // MPEG 2.5 { 0, 0, 0, 0 }, // Reserved { 22050, 24000, 16000, 0 }, // MPEG 2 { 44100, 48000, 32000, 0 } // MPEG 1 };
// Samples per frame - use [version][layer] const uint16_t mpeg_frame_samples[4][4] = { // Rsvd 3 2 1 < Layer v Version { 0, 576, 1152, 384 }, // 2.5 { 0, 0, 0, 0 }, // Reserved { 0, 576, 1152, 384 }, // 2 { 0, 1152, 1152, 384 } // 1 };
// Slot size (MPEG unit of measurement) - use [layer] const uint8_t mpeg_slot_size[4] = { 0, 1, 1, 4 }; // Rsvd, 3, 2, 1
uint16_t mpg_get_frame_size (char *hdr) {
// Quick validity check if ( ( ((unsigned char)hdr[0] & 0xFF) != 0xFF) || ( ((unsigned char)hdr[1] & 0xE0) != 0xE0) // 3 sync bits || ( ((unsigned char)hdr[1] & 0x18) == 0x08) // Version rsvd || ( ((unsigned char)hdr[1] & 0x06) == 0x00) // Layer rsvd || ( ((unsigned char)hdr[2] & 0xF0) == 0xF0) // Bitrate rsvd ) return 0;
// Data to be extracted from the header uint8_t ver = (hdr[1] & 0x18) >> 3; // Version index uint8_t lyr = (hdr[1] & 0x06) >> 1; // Layer index uint8_t pad = (hdr[2] & 0x02) >> 1; // Padding? 0/1 uint8_t brx = (hdr[2] & 0xf0) >> 4; // Bitrate index uint8_t srx = (hdr[2] & 0x0c) >> 2; // SampRate index
// Lookup real values of these fields uint32_t bitrate = mpeg_bitrates[ver][lyr][brx] * 1000; uint32_t samprate = mpeg_srates[ver][srx]; uint16_t samples = mpeg_frame_samples[ver][lyr]; uint8_t slot_size = mpeg_slot_size[lyr];
// In-between calculations float bps = (float)samples / 8.0; float fsize = ( (bps * (float)bitrate) / (float)samprate ) + ( (pad) ? slot_size : 0 );
// Frame sizes are truncated integers return (uint16_t)fsize; }[링크 : http://www.hydrogenaud.io/forums/index.php?showtopic=85125] |
'모종의 음모 > mp3 분석' 카테고리의 다른 글
mp3 joint stereo (0) | 2014.10.01 |
---|---|
mp3 id3 태그 내의 jpeg 추출 (0) | 2014.10.01 |
bitrate / sampling rate / mp3 / 등등등... (0) | 2014.09.16 |