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 에는 아래와 같은 정보가 들어가 순서대로 있다.- ID3v2/file identifier :
0x49, 0x44, 0x33 (offset: 00 ~ 02 / 3 bytes) - ID3v2 version : 0x03, 0x00 (offset: 03, 04 / 2 bytes)
- ID3v2 flags : (offset: 05 / 1 bytes)
- 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)
위의 경우 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
작성중....
댓글 없음:
댓글 쓰기