모종의 음모/mp3 분석2014. 10. 1. 16:27
mp3 파일을 들여다 보다 보니.. JFIF 라는 문구 발견
심심해서 적당하게 잘라내 보니 된다.

일단 시작 지점은 JFIF 앞 6바이트 부터
mp3 헤더인 FFFB... 이전 0x00 부분을 제외한(패딩으로 생각되니)

추출한 녀석은 320x320 인데 IDv3 에 표준 사이즈인지는 미지수



 

'모종의 음모 > mp3 분석' 카테고리의 다른 글

mp3 joint stereo  (0) 2014.10.01
mp3 format  (0) 2014.10.01
bitrate / sampling rate / mp3 / 등등등...  (0) 2014.09.16
Posted by 구차니
모종의 음모/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 구차니
모종의 음모/mp3 분석2014. 9. 16. 16:18
MP3 파일을 보면 아래와 같이 다양한 비트레이트가 있는데

익숙한 녀석으로는 96kbps / 128kbps / 192kbps / 320kbps 등이 있다.

[링크 : http://en.wikipedia.org/wiki/MP3]

물론 이런 다양한 비트레이트가 존재하더라도
CD의 원본 비트레이트
44.1kHz / 16bit / 2Channel 이기에
44100 * 16 * 2 = 1,411,200 bps
편의상 CD-DA의 비트 레이트는 1,411.2kbit/s 로 표기를 하는 듯한데..(1024가 아니잖아?)
[링크 : http://en.wikipedia.org/wiki/Bit_rate]

아무튼. 1.4Mbps 정도의 CD롬 음질이기에 mp3로 320kbps가 엄청 좋아보인다고 하더라도
실제로는 1/4 이상 압축된 상태란 것.
그렇기에 mp3 에서 동일 sampling rate / sampling bit / channel 이라고 하더라도 다른 bitrate가 존재할 수 있다.
[링크 : http://en.wikipedia.org/wiki/Sampling_(signal_processing)]
 

뜬금포 결론 : MP3의 비트레이트가 오락가락  

'모종의 음모 > mp3 분석' 카테고리의 다른 글

mp3 joint stereo  (0) 2014.10.01
mp3 id3 태그 내의 jpeg 추출  (0) 2014.10.01
mp3 format  (0) 2014.10.01
Posted by 구차니

일어문장을 출력하는데 &가 출력되지 않아 분석을 해보니
0xFF06 이라는 이상한 영역으로 문자열이 나오는 것을 발견..
Fullwidth 라는 녀석인데.. 일종의.. 고정폭 폰트 처럼 사용가능한 영역일거 같긴한데..

아무튼 폰트 갯수 제한으로 인해 따로 처리할 수 없기에
일반적인 0x0021 영역으로 매핑해도 무방할 듯 하다.


2014/06/09 - [모종의 음모/다국어 지원] - 일본어 유니코드

Posted by 구차니
일본어는
히라가나 영역(0x3050~309F)
카타카나 영역(0x30A0~30FF)
그리고 한자 영역(0x4E00~9FFF CJK Ideograph) 을 사용한다.

웬만한 건 다 IME에서 처리해서 유니코드 상에서는 조합을 해줄건 없기에
반음("),반탁음(º)이라던가 요음(작은 글씨)은 1:1로 매칭된다.
머.. 좋게 말하면.. 오토마타란게 필요없을 정도로 참.. 간단한 언어?
[링크 : http://blog.naver.com/kisshaedo/140171257202]


결론 : 별거 없다. 그냥 있는대로 그대로 출력하면 끝  
Posted by 구차니
쓸일이 생기려나..
일단 윈도우용은 존재하지 않아 cygwin을 통해서 실행을 해야 한다.

[링크 : http://fontforge.org/]
[링크 : http://fontforge.org/ms-install.html]

'모종의 음모 > 폰트 생성기' 카테고리의 다른 글

한글의 구성  (2) 2017.07.26
opentype font format  (0) 2017.07.26
폰트제작 프로그램  (0) 2017.07.26
Posted by 구차니
러시아어와 그리스어를 포함하면 128자를 넘어서 조금 골때려 질수도 있겠지만
아무튼.. 정리중..

[링크 : http://ask.nate.com/knote/view.html?num=1261043] 스페인어
[링크 : http://blog.naver.com/coolwestlife/40056861990] 프랑스어
 [링크 : http://ko.wikipedia.org/wiki/프랑스어]
 [링크 : http://ko.wiktionary.org/wiki/프랑스어_알파벳]
[링크 : http://blog.daum.net/ausland/2758416] 독일어
 
Posted by 구차니
번역질 할때 맞춤법 맞추기 좋을듯?

[링크 : http://speller.cs.pusan.ac.kr/]

'모종의 음모 > UFO:AI 한글화' 카테고리의 다른 글

UFO:AI 2.3.1 한글화  (2) 2011.01.15
UFO:AI SLI 시스템에서의 문제점  (5) 2011.01.08
UFO:AI 관련 프로젝트  (0) 2011.01.07
UFO:AI 2.3  (6) 2009.11.29
UFO:AI 2.3 용 po 파일  (2) 2009.11.27
Posted by 구차니
추가된 부분보다는 과거의 번역내용을 옮기는 작업에 가까움.



'모종의 음모 > UFO:AI 한글화' 카테고리의 다른 글

한글 맞춤법 검사  (0) 2011.12.17
UFO:AI SLI 시스템에서의 문제점  (5) 2011.01.08
UFO:AI 관련 프로젝트  (0) 2011.01.07
UFO:AI 2.3  (6) 2009.11.29
UFO:AI 2.3 용 po 파일  (2) 2009.11.27
Posted by 구차니
SLI 문자열과 줄은 왜 나타나는겨? -_-
리포팅을 해야하나....


'모종의 음모 > UFO:AI 한글화' 카테고리의 다른 글

한글 맞춤법 검사  (0) 2011.12.17
UFO:AI 2.3.1 한글화  (2) 2011.01.15
UFO:AI 관련 프로젝트  (0) 2011.01.07
UFO:AI 2.3  (6) 2009.11.29
UFO:AI 2.3 용 po 파일  (2) 2009.11.27
Posted by 구차니