research:id3v2
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
research:id3v2 [2012/12/23 23:22] – [프레임의 예] 127.0.0.1 | research:id3v2 [2014/10/09 21:24] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ====== ID3v2 태그에 관한 조사 ====== | ||
+ | ===== ID3v2 태그란 ===== | ||
+ | 간단하게, | ||
+ | |||
+ | ===== ID3v2 태그의 구조 ===== | ||
+ | ==== 헤더 ==== | ||
+ | ID3v2 태그는 MP3 파일의 전반부에 위치한다. 헤더는 " | ||
+ | |||
+ | ID3 다음의 1바이트는 major version, 다음 1바이트는 revision number이다. 보통 id3v2.3.0을 쓰므로 0x03 0x00이 들어간다. | ||
+ | |||
+ | 다음 1바이트는 플래그인데 상위 3비트만 플래그로 사용한다. 차례로 ' | ||
+ | |||
+ | 다음 4바이트는 태그의 전체 사이즈를 가리킨다. 태그 사이즈는 unsynchronization 후에 패딩 등을 모두 합친, 헤더 자체는 제외한 사이즈를 의미한다. 단, 확장 헤더는 포함한다. | ||
+ | |||
+ | ==== 헤더의 예 ==== | ||
+ | 파일의 처음부터 다음과 같은 이진 파일이 있다고 하자 | ||
+ | 49 44 33 03 00 00 00 02 2A 52 | ||
+ | |||
+ | |||
+ | |||
+ | ^ 이진수 값 ^의미 ^ | ||
+ | |49 44 33 |ID3 | | ||
+ | |03 00 | ||
+ | |00 | 플래그 없음| | ||
+ | |00 02 2A 52| 각 바이트로부터 상위 1비트를 제외한 7비트만을 가져와 32비트에서 28비트의 숫자로 만든다. 28비트의 수가 헤더의 사이즈. \\ 00 02 0A 52는 2진수로 '0000 0010 0010 1010 0101 0010' | ||
+ | |||
+ | ==== 프레임 ==== | ||
+ | 헤더 다음부터는 프레임이라는 정보가 나온다. 즉 하나의 메타데이터의 필드에 해당한다. | ||
+ | |||
+ | 프레임 헤더는 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 | ' | ||
+ | |00 00 89 26 | 0x8926, 즉 프레임의 내용은 모두 35110 바이트를 차지한다. 헤더 크기는 제외한다.| | ||
+ | |00 00 | 플래그는 모두 초기화되어있다.| | ||
+ | |00 | 문자 인코딩은 ISO-8859-1을 따른다 | | ||
+ | |69 6D 61 67 65 2F 6A 70 65 67 00| ' | ||
+ | |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. ' | ||
+ | | 00 00 00 2B | 프레임 내용의 크기는 43바이트 | | ||
+ | | 00 00 | 플래그 없음 | | ||
+ | | 01 | Unicode를 사용함| | ||
+ | | FF FE ... | 여기서부터 문자열이 시작된다. 'FF FE'는 BOM(Byte Order Mark). UTF-16 리틀 엔디안이다. 이 문자열을 실제로 읽으면 ' | ||
+ | |||
+ | |||
+ | |||
+ | 노래 제목을 뜻하는 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 ' | ||
+ | | 00 00 00 13 | 19바이트| | ||
+ | | 01 | Unicode를 사용함| | ||
+ | | FF FE .. | 문자열의 시작 유니코드로 ' | ||
+ | |||
+ | ===== 라이브러리 ===== | ||
+ | ==== C/C++ ==== | ||
+ | * [[http:// | ||
+ | ==== Python ==== | ||
+ | * [[http:// | ||
+ | |||
+ | === mutagen 사용법 ==== | ||
+ | [[http:// | ||
+ | |||
+ | <code python> | ||
+ | from mutagen.easyid3 import EasyID3 | ||
+ | |||
+ | audio = EasyID3(" | ||
+ | audio[" | ||
+ | audio.save() | ||
+ | </ | ||
+ | |||
+ | <code python> | ||
+ | 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 | ||
+ | </ | ||
+ | |||
+ | <code python> | ||
+ | from mutagen.easyid3 import EasyID3 | ||
+ | from mutagen.mp3 import MP3 | ||
+ | audio = MP3(" | ||
+ | audio.pprint() | ||
+ | </ | ||
+ | ===== 외부 링크 ====== | ||
+ | * [[http:// | ||
+ | * [[http:// | ||