모종의 음모/mp3 분석2014. 10. 1. 13:10
mp3
[링크 : 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]

MP3 file is divided into a small blocks - frames. Each frame has constant time length 0.026 sec.
But size of one frame (in Bytes) varies according to bitrate. Eg. for 128kbps it is (normally) 417 Bytes and for 192kbps 626 Bytes.
[링크 : http://www.multiweb.cz/twoinches/mp3inside.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
Posted by 구차니