MP3

좀 더 정확하게는, MPEG-1 Audio Layer III. MPEG-1에 정의된 오디오파일포맷으로, ISO/IEC 11172-3에 정의된 세 종류의 오디오 파일 포맷 표준 중 세번째이다. (그러하니 MPEG-3과는 전혀 관계가 없다!) 확장자는 보통 .mp3.

MP3은 엄밀하게 말하면 오디오코덱으로 프레임 포맷을 제외하면 구체적인 파일 포맷을 정의하지 않지만, 실질적으로는 모든 프레임을 순서대로 한 줄로 이어 놓은 포맷이 파일 포맷으로 통용되고 있다(JPEG와 유사한 경우). 프레임 외에도 파일의 맨 앞이나 맨 뒤에 ID3 태그나 APEv2 태그가 오는 경우도 왕왕 있으며, 추후의 확장이기는 하지만 무음으로 디코딩되면서 실질적으로는 메타데이터를 담고 있는 프레임이 맨 처음에 나타나기도 한다.

구조

MP3은 항상 1152개(Layer III 기준)의 샘플을 담고 있는 논리 프레임(logical frame)과, 이 논리 프레임을 적절히 감싸 주는 물리 프레임(physical frame)의 열로 구성된다. 물리 프레임은 항상 4바이트 헤더로 시작하며, 논리 프레임에도 헤더가 존재는 하지만 만약 연속된 논리 프레임들이 같은 헤더를 공유하고 크기가 충분히 작다면 한 물리 프레임에 합쳐질 수 있다(반대로 한 논리 프레임이 너무 크다면 헤더가 같은 여러 물리 프레임으로 나뉜다). 물리 프레임 헤더는 항상 13비트 동기화 패턴1)이 오기 때문에, 동기화 패턴을 담지 않은 임의의 데이터가 프레임들 사이에 들어 가는 것이 가능하다. 각 논리 프레임은 서로 다른 비트레이트로 코딩될 수 있으며(이를 가변비트레이트라 부른다) 디코더는 이러한 프레임들을 아무 사전 정보 없이도 디코딩해 내야 하지만, 실제로는 전체 비트스트림의 길이를 알아 낸다거나2) 하는 이유로 정보가 필요한 경우도 있는데 이러한 데이터는 보통 첫 프레임으로 위장하고 있는 메타데이터 프레임에 집어 넣는 것이 보통이다.

프레임 헤더 뒤에는 프레임 디코딩에 필요한 부가 데이터(side information이라 부름)와 실제 데이터가 따라 온다. (기술적으로는 부가 데이터 또한 헤더와 마찬가지로 여러 논리 프레임이 공유할 수 있다.) 실제 데이터는 좀 더 정확히는 2개(스테레오일 경우 4개)의 부분(granule이라 부름)으로 나뉘어 있으며, 고로 각 granule은 576개의 샘플을 나타낸다. 인코딩 시점에서 이 576개의 샘플은 32개의 필터 뱅크(analysis filter bank)를 통해 정해진 주파수 대역에 해당하는 샘플만을 나타내는 18개짜리 샘플 묶음 32개로 변환되며, 따라서 각 묶음 안에서는 본래의 샘플보다 훨씬 다운샘플링된 데이터가 들어 가는 것이다3). 이 32개의 묶음은 각각 변경이산코사인변환(MDCT) 알고리즘을 통해 변환된 뒤 양자화 과정을 거쳐 최종적으로 허프만코딩을 통해 비트열로 바뀌는데, MDCT의 특성4)상 각 묶음 별로 이전 granule에 들어 갔던 대응되는 묶음과 합쳐져서 36개의 샘플을 가지고 변환을 돌린다. 실제로는 변환 크기는 항상 36인 것은 아니며, 고주파수를 더 잘 살리기 위해 36인 경우(long block), 급격하게 변하는 샘플을 처리하기 위해 12인 경우(short block), 그리고 밴드 별로 변환 크기가 다른 경우(mixed block) 세 종류로 나눌 수 있다. 어찌 되었든 디코더는 이 과정을 역으로 수행하여(synthesis filter bank) 본래의 샘플들 + 다음 granule을 디코딩할 때 겹쳐질 샘플들을 얻어 낸다. 이 과정은 스테레오의 경우에도 크게 다르지는 않지만(granule이 한 논리 프레임 당 4개 온다는 것만 빼고), 스테레오의 경우 두 채널이 서로 비슷한 경우가 드물지 않기 때문에 두 채널을 적절히 연관지어서(channel coupling) 더 좋은 결과를 내는 것이 가능하다. MP3는 두 종류—mid-stereo(MS)와 intensity stereo(IS)—의 커플링 방법을 제공하는데 IS는 손실이 심한 편이라 그 자체로는 손실이 없는 MS가 더 널리 쓰이는 편이다.

변환 크기를 어떻게 정하는 지는 인코더의 재량에 달렸으며, 사실은 표준 문서 자체에는 인코더 알고리즘이 서술되어 있지도 않다(아주 없는 건 아닌데, non-normative해서 표준의 일부라고 보기는 좀 그렇다). 변환 크기는 주파수 대역에 중점을 둘 것인지 시간 대역에 중점을 둘 것인지를 나타내는 중요한 요소이기 때문에 변환 크기를 잘 정하기 위한 음향 심리학적 모델(psychoacoustic model)이 중요하며, LAME 등의 상용 인코더는 이 부분에서 굉장한 삽질을 통해 본래 참조 구현보다도 더 좋은 모델을 뽑아 냈다(…). 반면 디코더는 주어진 프레임을 (일정 수준 이하의 오차를 제외하면) 표준과 완벽하게 일치하도록 디코딩해야 한다.

바깥 링크

1) MPEG 2.5로 불리는 비표준 포맷에서는 이 패턴의 길이를 12비트로 줄이고 뒤에 따라 오는 버전 비트를 2비트로 늘려서 기존의 MPEG-1/2와 구분한다.
2) 전체 프레임을 모두 한 번 읽어 보지 않는 이상 비트스트림이 디코딩된 뒤 길이가 어떻게 될지 알아낼 수는 없다. 종종 미디어 플레이어에서 곡의 시간이 순간적으로 변한다거나(!) 보이는 재생 시간은 끝났는데도 계속 재생하고 있다거나 하는 경우가 있는데 바로 이것 때문이다.
3) 사실 이 다운샘플링 때문에 이 과정을 (양자화 없이) 역으로 적용한 뒤 모든 샘플들을 합쳐도 원래 샘플과 완벽하게 일치하지는 않는다. 단지 매우 비슷할 뿐.
4) MDCT는 임의 길이의 시간 도메인 신호에 연속적으로 변환을 적용할 수 있도록 하기 위해서 주파수 도메인에서의 신호 길이가 시간 도메인보다 두 배 짧다. 따라서 역 MDCT(IMDCT)를 적용할 때 나온 시간 도메인 신호는 실제로는 올바른 것이 아니지만, 두 개의 연속된 시간 도메인 신호를 반씩 겹쳐서 "합치면" 겹친 부분은 올바른 신호가 된다.

도쿠위키DokuWiki-custom(rev 9085d92e02)을 씁니다.
마지막 수정 2011-05-30 18:25 | 외부 편집기