MP3 파일의 구조

|
일반적으로 사용되는 MP3 파일의 구조를 ID3태그와 같은 메타정보까지 포함하여 알아보자.

이 포스팅에서 다루는 데이터는,
MP3 Frame, ID3v1, ID3v2, Lyrics3v2, APETags 이다.

이 데이터들의 순서는 다음과 같다.


+--------------------------+| ID3v2 |+--------------------------+| MP3 Data |+--------------------------+| APE Tags |+--------------------------+| Lyrics3v2 |+--------------------------+| ID3v1 |+--------------------------+<br />
위와 같은 순서로 나타나게 된다.

각 데이터별로 확인해 보자.

1. ID3v2
널리 사용되는 ID3태그의 2.x 버전이다.
태그 헤더와 가변적인 여러개의 프레임으로 구성되어 있고, 프레임의 길이 역시 가변적이다.
파일 가장 앞에 'ID3' 라는 ASCII 문자로 판별이 가능하다.
ID3 뒤로 두 바이트의 버전 식별자, 한 바이트의 플래그,
그리고 그 뒤로 4바이트의 ID3v2 길이가 나온다.
이 길이를 나타내는 4개의 바이트는 synchsafe형식으로 저장되어 있다.
synchsafe란 각 바이트의 상위 1비트를 0으로 고정하는 방식이다. 4바이트를 사용한다면 각 바이트당 7비트만 사용하게 되므로
유효 값은 2^28이 된다.

2.4에서는 각 프레임에 있는 길이 데이터 역시 synchsafe로 저장이 되지만,
2.3은 ID3v2헤더는 synchsafe, 각 프레임의 길이는 4byte그대로 저장이 된다.

2.4의 데이터 구조는 다음 링크를 참고한다.
http://www.id3.org/id3v2.4.0-structure


헤더에서의 길이는 ID3v2헤더 크기를 제외한 데이터이다.
즉, MP3파일이 ID3로 시작이 된다면 실제 MP3데이터의 위치는 ID3v2헤더상의 길이 + 10바이트가 되는 것이다.
(10byte = 3(ID3) + 2(버전) + 1(플래그) + 4(길이))

하.지.만.
가지고 있는 MP3파일들을 분석해 본 결과,
ID3v2의 태그의 길이와 실제 MP3파일이 시작하는 위치는 꼭 맞지가 않았다.
MP3플레이어는 이런 케이스도 고려가 되는 듯 싶었다.

MP3 데이터 판별 방법은 MP3 Frame 구조에서.


2. MP3 Frame
MP3 데이터는 여러개의 프레임으로 구성이 되어 있고
각 프레임은 헤더와 데이터로 구성이 되어 있다.

헤더는 4바이트를 차지하며,
헤더의 시작 12비트는 1로 채워져 싱크를 맞추는 용도로 사용되고,
나머지 비트로 MPEG-1, MPEG-2라든가 , Layer 1,2,3, 그리고 비트레이트 등의 정보를 가지고 있다.

위에서 나온, ID3v2태그의 끝을 찾았는데 실제 데이터인지는 어떻게 확인을 했느냐,
- ID3v2의 길이로 판단된 실 MP3데이터의 시작점을 찾는다
- 앞 12비트가 FF Fx 가 아니면 한 바이트씩 FF Fx를 찾는다.
- FF Fx를 찾으면 MP3 Frame 헤더 구조에 따라 MP3 Frame 전체 길이를 구한다.
- 이 과정으로 구해진 프레임의 전체 길이 이후에 다시 FF Fx가 나오면 이것은 정상 프레임.

으로 판단을 했다. 실제 MP3 플레이어에서는 어떻게 하는지는 불분명.

MP3 Frame에 대한 자세한 내용은 다음을 참고.
http://www.id3.org/mp3Frame



3. APE Tags
APETags는 MPC 오디오 파일을 위해 만들어진 메타데이터 표준이다.
foobar2000으로 인코딩을 하는 경우 ReplayGain값이 일부 들어가는 듯 싶다.

APETags는 v1과 v2가 있는데, 구조 자체는 동일하다.

APE태그는 MP3 Frame들의 데이터 바로 뒤에 위치하며,
APETAGEX 라는 문자열로 시작이 된다.

8바이트 뒤에 버전을 나타내는 4바이트. 이 4바이트는 1000이나 2000의 값을 가진다. (10진수)

그다지 많이 쓰이지는 않는것으로 보이므로 이쯤에서 패스.
자세한 내용은 다음을 참고.

APEv1 : http://wiki.hydrogenaudio.org/index.php?title=APEv1_specification

APEv2 : http://wiki.hydrogenaudio.org/index.php?title=APEv2_specification
뭐 두개가 크게 다르진 않다.


4. Lyrics3v2
가사를 저장하는 메타데이터 부분.
아마 ID3v1시절에 가사를 저장하기 위해 쓰였던 것 같다.
시간데이터를 넣어 싱크 가사도 가능하지만
구글을 뒤져봐도 지원하는 프로그램은 찾기가 힘들다.

ID3v1태그의 앞에 위치하며,
LYRICSBEGIN으로 시작하여 LYRICS200으로 끝난다.

특이하게, 숫자형 값들이 (길이 등) 바이트 자체로 저장된것이 아니라
ASCII값으로 저장되어 있다.

http://www.id3.org/Lyrics3v2



5. ID3v1

ID3v2 이전의 태깅 구조.
대략 2000년도 이전의 MP3에는 이 형식으로 많이 저장되어 있다.


파일의 마지막 128바이트에 위치하며,
곡명, 아티스트, 앨범명, 연도, 코멘트 (v1.1에는 장르구분) 데이터가 고정 길이로 저장되어 있다.
1.0과 1.1의 차이는 장르를 저장하는지의 여부인데,
30바이트의 코멘트 필드 마지막 2바이트를 활용하여 장르데이터를 저장한다.
인코딩은 ISO-8859-1 고정이기 때문에 코드페이지가 다른 시스템에서 저장된 데이터는
제대로 보이지 않는다. 영어는 크게 상관 없지만, 일본에서 다운받은 곡인 경우
노래제목 등이 깨지는 이유가 저장 인코딩은 일본 표준인데,
국내 환경에서는 EUC-KR로 디코딩을 시도하기 때문에 깨져보이는 것이다.


TAG로 시작되며, 고정 길이를 가지기 때문에 찾기는 쉽다.


http://www.id3.org/ID3v1





보너스.
국내 MP3P에서 사용되는 (아이리버나, 코원 등) 싱크 가사는
국내 업체가 라이센스를 가지고 있는 기술이며, 이는 국제 표준이 아니다.
분석은 못해봤는데 아마 ID3v2의 특정 프레임에 통째로 저장하는게 아닐까... 싶다.


흔히 사용하는 mp3tag 프로그램은 위 태그들의 존재유무를 확인할 수 있지만
수정 기능은 ID3v2 (v1)만 지원을 한다.


ID3v2에서의 텍스트 프레임은 유니코드 인코드를 사용할 수 있어 국제적으로 호환될 수 있으므로 되도록이면 ID3v2를 사용하자.















And