[컴] MP3 ID3 Tag 분석




ID3 tag 를 편집하다가 뜬금없이 script 를 짜보고 싶어졌다. 그래서 mp3 id3 tag 를 좀 분석해 보려 한다.

ID3 tag version

version 에 대한 차이는 ref. 1 에 설명이 잘 되어 있다. 그러니 ref. 1 을 참고하자. 여기서는 id3v2.4.0 을 가지고 분석할 것이다.



ID3 tag version 2.4.0 에 대한 spec 문서는 ref. 2 에 있으니 참고하기 바란다.


ID3 tag version 2.3.0

여기서는 ID3 tag version 2.3.0 파일을 분석하기로 한다. 이 녀석에 대한 문서는 ref. 3 에 있다. 그런데 version 2.3.0 은 informal standard 라고 이야기 하고 있다. 여기서 informal standard 는 formal standard 가 release 되기 전에 징검다리 역할로 존재하는 녀석이라고 이야기 하고 있다. 이 informal standard 를 가지고 만든 formal standard 는 v2.4.0 이다.

그래서 대부분의 spec 이야기는 v2.4.0 을 가지고 분석할 것이지만, v2.3.0 에 v2.4.0 에 없는 내용을 가지고 있기 때문에 양쪽을 다 참고해야 한다.



구조

ID3 tag 의 전체적인 구조는 아래와 같다.

전체적인 구조(overall structure)
     +-----------------------------+
     |      Header (10 bytes)      |
     +-----------------------------+
     |       Extended Header       |
     | (variable length, OPTIONAL) |
     +-----------------------------+
     |   Frames (variable length)  |
     +-----------------------------+
     |           Padding           |
     | (variable length, OPTIONAL) |
     +-----------------------------+
     | Footer (10 bytes, OPTIONAL) |
     +-----------------------------+

ID3v2 header

첫 10 byte 에는 아래와 같은 정보가 들어가 순서대로 있다.

  1. ID3v2/file identifier :
    0x49, 0x44, 0x33  (offset: 00 ~ 02 / 3 bytes)
  2. ID3v2 version : 0x03, 0x00 (offset: 03, 04 / 2 bytes)
  3. ID3v2 flags : (offset: 05 / 1 bytes)
  4. ID3v2 size : (offset : 06 ~ 09 / 4 bytes)

항목 hex 값 offset bytes
ID3v2 file ID 0x49, 0x44, 0x33 ID3 00 ~ 02 3 bytes
ID3v2 version 0x03, 0x00 major ver: 3
minor ver: 0
03, 04 2 bytes
ID3v2 flags b00000000 Unsynchronisation : 0
Extended header : 0
Experimental indicator : 0
Footer present : 0
05 1 bytes
ID3v2 size 0x00 0x02 0x6C 0x53 06 ~ 09 4 bytes




version

처음 1byte(offset 03) 은 major version 이고, 그 다음 1-byte(offset 04) 는 revision version 이라고 한다. major version 끼는 호환(compatibility) 이 되지 않지만 revision 은 major 버전이 같다면 호환이 된다고 한다.

그리고 major version, revision version 은 모두 0xff 값을 절대 갖지 않는다고 한다.


flags

flag 는 1byte 로 되어 있다. 0~7 bit 들 각각의 의미는 아래와 같다.

  • 7 bit : Unsynchronisation
  • 6 bit : Extended header, 이 flag 로 extended header 의 존재여부를 알 수 있다.
  • 5 bit : Experimental indicator
  • 4 bit : Footer present
  • 3 ~ 0 bit : 무조건 0 이 되어야 한다. 그렇지 않으면 parser 에서 제대로 parsing 을 못할 수도 있다고 한다.


size

32 bit synchsafe integer 로 되어 있다. synchsafe integer 는 아래 설명을 참고하자.

이 size 는 mp3 의 size 가 아니라 header 의 size 를 나타내는 것이다. 이것을 착각해서 한참을 헤맸다.^^;;;

size 는 아래 3가지 요소의 합이다.

  • size = extended header 의 byte 길이 + padding + frame

그래서 tag 의 총 size 에서 header size 10 byte 를 뺀 값이 된다.
  • size filed 의 값 = tag 의 총 size - 10 byte(header) - 10 byte(footer)
만약 footer 가 존재한다 해도 size field 는 footer 의 길이를 고려하지 않기 때문에 size field 의 값은 그대로이다.

위의 경우 size 의 계산은 아래와 같이 할 수 있다.
0x00 0x02 0x6C 0x53
--> b00000000  / b00000010 / b01101100 / b01010011--> b0000/00000000/10110110/01010011--> 0x00 0x00 0xB6 0x53
--> 46,675 (bytes)



Unsynchronisation

Unsynchronisation 은 ID3v2 tag 를 처리할 수 있는 software/hardware 에는 크게 필요하지 않는데, Unsynchronisation는 MPEG 1/2 layer 1, 2, 3, MPEG 2.5, AAC 에 있는 tag 에만 쓸모가 있다. 고 얘기한다.

참고로, 이부분 을 보면ID3 tag 가 처음에는 MP3  를 위해서 만들기는 했지만, 다른 format 에서도 metadata 로 쓰인다고 한다.


Synchsafe integer

개인적으로 어떤 점이 unsynchronisation 인지는 모르겠지만, 여기서 unsynchronisation 을 알리기 위해 어떤 표시를 해 줘야 하는데, 그것을 위해서 byte 중에 leftmost bit 을 사용하지 않고 남겨두는 것을 synchsafe integer 라고 이야기 하고 있다.

예를 들면 일반적인 8-bit integer 를 synchsafe integer 로 표현하면 아래처럼 값을 표현하는 것이다.
0x11100000  -> 0x00000001, 0x01100000

자세한 이야기는 ref. 2 의 Section 6. 을 참고하자.



Extended Header

extended header 는 선택사항이다. 있어도 그만, 없어도 그만인 것이다. 이 extended header 의 길이는 가변적이다. 그래서 extended header 의 총 size 를 표시 해 준다.

Extended header size   4 * %0xxxxxxx
Number of flag bytes       $01
Extended Flags             $xx

위의 정보가 항상 들어가 있기 때문에, extended header 의 size 는 항상 6 byte 이상이 된다.

32 bit synchsafe integer


Frame

frame 은 header 와 1개 이상의 field 로 이뤄져 있다.
  • frame header(10 bytes) + fields
우리가 흔히 정리하는 ID3 tag 들이 이 Frame 의 내용이라고 보면 된다.


frame header

frame header 는 아래와 같은 모양을 하고 있다.
Frame ID      $xx xx xx xx  (four characters)
Size      4 * %0xxxxxxx
Flags         $xx xx



Frame ID

frame header 에서 쓰이는 Frame ID 들은 아래 링크에서 찾아 볼 수 있다.
frame 중에 Text information 을 포함하는 녀석의 frame id 는 'T' 로 시작하는 4글자이다. 여기서 'TXXX'만 쓰이지 않는다.

"X", "Y" and "Z" 로 시작하는 frame id 는 실험용이고, 아무나 사용할 수 있다.


size

frame size 를 나타낸다. frame header 의 size 인 10 byte 는 뺀 나머지 사이즈이다.

flags

사용되지 않는 flag 는 00 으로 만들어야 한다.(cleared 되어야 한다.)
아래 처럼 각 byte 의 3 개의 most significant bit 만 사용한다.
%abc00000 %ijk00000

a : tag 가 변경되면 이 frame 을 버린다.(1) / 보존한다(0)
b : file 이 변경되면 이 frame 을 버린다.(1) / 보존한다(0)

자세한 내용은 ref. 3 의 3.3.1. Frame header flags 를 확인하자.


Text information frame

  • text information frame : frame header + fields 
  • fields : text-encoding(1 byte) + information

text information 은 '00' 을 끝으로 본다. '00' 이후의 값은 무시한다.


Frame ID : TYER
Size : 00 / 00 / 00 / 0A
flags : 00 / 00
text-encoding : 00
text-information : 32/30/31/34/30/37/31/36/00


size

size 는 text-encoding + text-information 을 하니 10(0x0A) 가 됐다.

text-encoding

text-encoding 은 아래와 같다.

  • 00 : ISO-8859-1 character set
  • 01 : Unicode character set





작성중....


See Also


  1. id3lib - The ID3v1/ID3v2 Tagging Library


References

  1. 블로그가 뭔가염? 먹는건가염? 우걱우걱 :: MP3 ID3 tag 분석
  2. id3v2.4.0-structure - ID3.org
  3. id3v2.3.0 - ID3.org

댓글 없음:

댓글 쓰기