====== ID3v2 태그에 관한 조사 ======
===== ID3v2 태그란 =====
간단하게, 음악에 부가적인 메타데이타를 기술하기 위한 포맷
===== ID3v2 태그의 구조 =====
==== 헤더 ====
ID3v2 태그는 MP3 파일의 전반부에 위치한다. 헤더는 "ID3"라는 문자열로 시작한다. (0x49 0x44 0x33)
ID3 다음의 1바이트는 major version, 다음 1바이트는 revision number이다. 보통 id3v2.3.0을 쓰므로 0x03 0x00이 들어간다.
다음 1바이트는 플래그인데 상위 3비트만 플래그로 사용한다. 차례로 'unsynchronization', 'extended header', 'experimental header'를 가리킨다.
다음 4바이트는 태그의 전체 사이즈를 가리킨다. 태그 사이즈는 unsynchronization 후에 패딩 등을 모두 합친, 헤더 자체는 제외한 사이즈를 의미한다. 단, 확장 헤더는 포함한다.
==== 헤더의 예 ====
파일의 처음부터 다음과 같은 이진 파일이 있다고 하자
49 44 33 03 00 00 00 02 2A 52
^ 이진수 값 ^의미 ^
|49 44 33 |ID3 |
|03 00 |버전 3.0 |
|00 | 플래그 없음|
|00 02 2A 52| 각 바이트로부터 상위 1비트를 제외한 7비트만을 가져와 32비트에서 28비트의 숫자로 만든다. 28비트의 수가 헤더의 사이즈. \\ 00 02 0A 52는 2진수로 '0000 0010 0010 1010 0101 0010'이나 28비트로 만들면 '000 0010 010 1010 101 0010'이다. 이는 10진수로 38226이다.|
==== 프레임 ====
헤더 다음부터는 프레임이라는 정보가 나온다. 즉 하나의 메타데이터의 필드에 해당한다.
프레임 헤더는 10바이트로 되어 있다.
프레임 헤더의 처음 4바이트는 프레임의 ID이다. 이것은 미리 정해져 있는 4개의 문자열로 이루어진다.
그다음의 4바이트는 프레임의 사이즈이다. 프레임 헤더를 제외한 프레임의 크기이다.
마지막의 2바이트는 플래그이다. 각 바이트의 상위 3바이트를 사용하는데 첫번째 바이트는 상태 메시지와 관련이 있고 두번째 바이트는 태그 자체가 인코딩된 방법과 관계있다.
==== 프레임의 예 ====
다음은 한 프레임의 시작이다.
41 50 49 43 00 00 89 26 00 00 00 69 6D 61 67 65 2F 6A 70 65 67 00 03 00 FF D8 ...
^ 이진수 값 ^의미 ^
|41 50 49 43 | 'APIC' 이 문자열은 앨범의 사진 정보를 의미한다.|
|00 00 89 26 | 0x8926, 즉 프레임의 내용은 모두 35110 바이트를 차지한다. 헤더 크기는 제외한다.|
|00 00 | 플래그는 모두 초기화되어있다.|
|00 | 문자 인코딩은 ISO-8859-1을 따른다 |
|69 6D 61 67 65 2F 6A 70 65 67 00| 'image/jpeg'이라는 MIME 타입. '0x00'으로 끝난다.|
|03 | 이것은 이 그림이 전면 커버 그림이란 것을 의미한다.|
|00 | 이 위치에는 그림에 대한 설명을 넣을 수 있으나, 현재 비어 있다.|
|FF D8 | 이미지 정보의 시작이다. 실제로 JPEG 포맷 파일은 'FF D8'로 시작한다. 여기서부터 35110 바이트를 끊어 내면 이미지 파일이 된다.|
이 다음의 프레임 값은 다음과 같다.
54 41 4C 42 00 00 00 2B 00 00 01 FF FE 53 00 65
00 6F 00 74 00 61 00 69 00 6A 00 69 00 20 00 61
00 6E 00 64 00 20 00 42 00 6F 00 79 00 73 00 20
00 49 00 49 00
^ 이진수 값 ^의미 ^
| 54 41 4C 42 | TALB. 'Original album/movie/show title'|
| 00 00 00 2B | 프레임 내용의 크기는 43바이트 |
| 00 00 | 플래그 없음 |
| 01 | Unicode를 사용함|
| FF FE ... | 여기서부터 문자열이 시작된다. 'FF FE'는 BOM(Byte Order Mark). UTF-16 리틀 엔디안이다. 이 문자열을 실제로 읽으면 'Seotaiji and Boys II'가 된다. 널 문자로 끝나지 않음에 유의.|
노래 제목을 뜻하는 TIT2 프레임을 읽는다.
54 49 54 32 00 00 00 13 00 00 01 FF FE 58 D5 EC
C5 00 AC 28 00 55 4F 82 59 4C 6B 29 00
^ 이진수 값 ^의미 ^
| 54 49 54 32 | TIT2. The 'Title/Songname/Content description' frame is the actual name of the piece|
| 00 00 00 13 | 19바이트|
| 01 | Unicode를 사용함|
| FF FE .. | 문자열의 시작 유니코드로 '하여가(何如歌)'가 나온다. |
===== 라이브러리 =====
==== C/C++ ====
* [[http://id3lib.sourceforge.net/|id3lib]]
==== Python ====
* [[http://code.google.com/p/mutagen/|mutagen ]]
=== mutagen 사용법 ====
[[http://code.google.com/p/mutagen/wiki/Tutorial]]을 참고한다.
from mutagen.easyid3 import EasyID3
audio = EasyID3("example.mp3")
audio["title"] = u"An example"
audio.save()
from mutagen.easyid3 import EasyID3
print EasyID3.valid_keys.keys()
키 목록은 다음과 같다
album
albumartistsort
albumsort
arranger
artist
artistsort
asin
author
barcode
bpm
compilation
composer
composersort
conductor
copyright
date
discnumber
discsubtitle
encodedby
genre
isrc
length
lyricist
media
mood
musicbrainz_albumartistid
musicbrainz_albumid
musicbrainz_albumstatus
musicbrainz_albumtype
musicbrainz_artistid
musicbrainz_discid
musicbrainz_trackid
musicbrainz_trmid
musicip_fingerprint
musicip_puid
organization
performer
performer:*
releasecountry
replaygain_*_gain
replaygain_*_peak
title
titlesort
tracknumber
version
website
from mutagen.easyid3 import EasyID3
from mutagen.mp3 import MP3
audio = MP3("example.mp3", ID3=EasyID3)
audio.pprint()
===== 외부 링크 ======
* [[http://en.wikipedia.org/wiki/ID3|ID3 - Wikipedia, the free encyclopedia]]
* [[http://id3.org/id3v2.3.0|ID3v2.3.0 Informal standard]]