이미지가 그렇듯이 audio도 파일 포맷이 존재한다.
먼저 uncompressed, 이미지로 치자면 BMP에 해당하는 게 있으니 PCM(Pulse Code Modulation) 이라고 한다.
그리고 compressed 가 있는데, 이는 codec을 사용하여 압축 된 포맷을 말한다.
wav 는 비 압축 오디오를 저장하기 위한 가장 일반적인 선택이다.
mp3 는 인기 압축 포맷으로 전세계에서 가장 유명한 포맷이라고 해도 과언이 아니다.
mp3처럼 원본 소리(PCM)을 압축하고, 압축한 것을 다시 복구하여 재생하기 위해서는 codec 이라고 불리는 것이 필요하다.
대충 동영상 따위를 볼 때 여기저기서 코덱이 필요합니다, 코덱이 없으니 설치하세요 등을 많이 봤던 그 코덱이다. 오디오와 동영상은 약간 다르지만 역할은 같다. 나는 여지껏 뭔지 잘 몰랐는데 이거 보니까 쉽게 이해는 됐다.
Codec
코덱은 크게 2가지로 나뉜다.
음성에 주로 사용되는 Lo-Fi 코덱과 음악등에 사용되는 Hi-Fi 코덱이다.
대충 속도,용량을 우선으로 하는 코덱과 성능을 우선으로 하는 코덱 정도로 생각하자. 아래에서 자세히 설명한다.
Audio File Content
오디오 파일이 포함하는 내용은 아래 세 가지이다.
1. Audio Samples
실제 소리의 내용. PCM 혹은 codec을 통해 압축된 sample 이 들어간다.
2. Audio Format
uncompressed : sample rate, bit depth, channel count.
compressed : 사용중인 codec, 해당 codec이 요구하는 매개변수 (bit rate 등)
3. Metadata (optional)
아티스트 이름, 앨범 이름, 트랙번호, timestamp 등. 추가할 수도 있고 제외될 수도 있다.
WAV Format
.wav 파일의 구조는 위와 같다.
가장 먼저 RIFF 헤더로 시작하고, 헤더 위에 2개 이상의 chunk 가 온다. (format, data 는 필수이고 metadata에 따라 3개 이상일 수 있음)
Chunk size는 바로 다음, format 부터의 내용에 대한 크기이다. 즉, 파일 전체 용량 - 8byte 라고 보면 된다.
이 전체 파일 용량을 가리키는 게 4byte이므로, wav 파일은 4GB를 넘을 수 없다. 넘고 싶다면 RF64라는 걸 써야한다.
유의할 점은 wav 는 little endian 이라는 점, 그리고 RIFF 나 WAVE가 RIFF\0 가 아니라 그냥 RIFF 라는 점이다.
Format chunk
format chunk는 이 파일에 대한 정보를 담고 있다. 어떤 포맷인지, 채널은 몇개인지, 속도는 어떤지 등의 정보를 담는다.
첫번째가 잘 안 보이는데, fmt + (스페이스) 이다. fmt\0 이 아니다.
Audio format 은 여기에 들어있는 게 PCM인지, 아니면 압축된 sample인지에 대한 정보를 담고 있다. 어느정도 유명한 코덱의 list가 존재하며, 해당 list에 있는 codec은 자신의 번호를 가지고 있어서 여기에 적힌 번호에 따라 어떤 코덱을 사용했는지 알 수 있다.
float point 방식으로 저장한 PCM일 경우, 3번이 할당된다.
Average Byte Per Second 는 말 그대로 초당 몇 바이트가 출력되는지에 대한 데이터이다. *8 하면 bitRate가 된다.
PCM의 경우에는 단순하게 bitrate = sample rate * bit per sample * channel count 라서 계산하기 쉽지만, 압축했을 경우 코덱에 따라 계산하기 어려운 경우가 잦으므로 이 값은 매우 유용하게 쓰일 수 있다. 실제로 오디오 파일을 잘라내고자 할 경우, 예를 들어 10초에서 잘라내고 싶다면 대체 몇번째 bit까지 잘라내야 10초인지 알려면 해당 값이 필요할 것이다.
Block align 은 한번에 몇 개의 바이트가 사용되는지에 대한 데이터이다. 한 순간에 몇 바이트가 출력되는지에 대한 정보를 알아야 캐시라인 등의 문제가 덜 생길 것이므로, 편집자보단 재생 프로그램적으로(디코더나 플레이어에게) 중요하다고 볼 수 있겠다.
PCM의 경우 byte per sample * channel count 가 도니다. 16bit stereo일 경우 4 byte.
extra bytes 는 PCM에선 사용되지 않지만, 일부 코덱의 경우 추가적인 데이터를 요구할 수 있기에 비워놓은 여유공간이다.
위와 같은 format chunk를 WAVEFORMATEX 라고 한다. 오디오 포맷 정보를 전달해야 하므로 매우 중요하며, 윈도우 외의 운영체제에서는 다른 이름을 쓰기도 하지만 같은 역할을 하는 무언가가 존재해야만 한다.
Data Chunk
Data chunk는 실제로 소리에 대한 정보를 담고 있다.
Data chunk size는 말 그대로 소리에 대한 데이터, 다음부터 이어진 audio data의 크기를 말한다.
Audio Data는 sample에 대한 데이터가 이어서 주르륵 나타난다. 채널이 2개 이상일 경우 left, right, left ... 이런 식으로 번갈아가며 나온다.
이때 포맷에 대한 정보가 없다? 어디서부터 어디까지가 한 샘플인지 알 수가 없어서 제대로 읽을 수가 없을 것이다.
그래서 포맷이 매우 중요하다. 포맷이 없으면 wav는 제대로 이해할 수(재생할 수) 없는 것이다.
그렇기 때문에 wav는 스트리밍 서비스 등에 그다지 적합하지 못하다.
WAV와 유사한 포맷으로 AIFF라는 것이 있다.
wav는 microsoft에서 만든 포맷인데 반해, aiff는 apple의 포맷이다. 애플 버전 wav라고 생각하면 될 것 같다.
대체로 유사하지만 big endian 이라는 것만 다른 것 같다. 세부적으로 헤더 같은건 약간의 차이만 있는 것 같다.
딱히 크게 쓸 일은 없을 듯. 어차피 애플도 wav 지원할 텐데.
MP3 Format
가장 유명하고, 가장 인기있는 압축 포맷이다.
128kbps (kilo bits per second) 로 압축한 mp3 파일은 동일한 퀄리티의 PCM보다 11배 적은 용량을 차지한다.
MP3 file의 내용
1. Meatdata
역시 optional 이라고 하는데, 검색해보면 필수인 것 같기도 하고....?
아티스트 정보나 제작일 등의 정보가 담기는 메타데이터 헤더이다. 버전은 크게 ID3 tag, ID3v2 tag 두 가지가 있다. 둘다 문자 "TAG"로 시작한다.
초기 ID3는 파일 후반부에 붙었는데, 자주 에러가 발생하였으며 에러 발생 시 음원 전체를 읽을 수 없었기에 파일 끝에 붙었다. 내용은 고정적이었으며 128 byte 고정이다.
ID3v2의 경우 가변적으로 변했고, 원하는 내용을 새로 추가하는 것도 가능해졌다. 그렇기에 파일 제일 앞에 들어가게 되었다. 파일을 끝까지 읽지 않아도 파일정보를 얻을 수 있게 되었으므로 좋아졌다. 다만 용량이 커졌고, 크기가 변화할 경우 뒤에 있는 모든 오디오 데이터가 이동되어야 하는 문제가 발생하는 경우가 있기 때문에 태그와 소리정보 사이에 공간을 두기도 한단다.
둘 다 동시에 한 파일에 존재할 수 있으며, 서로 호환되지 않는다.
2. MP3 Frame
mp3 파일에서 소리 정보는 여러 개의 프레임으로 나뉘어져 있다. 이 프레임은 하나하나의 샘플이 아니라, 몇개의 샘플이 합쳐진 하나의 작은 블록이라고 볼 수 있다. 각각의 프레임은 수백 바이트 크기로 보통 2~30 밀리초 정도의 오디오를 표현한다고 한다.
frame 이 WAV에서의 sample 과 다른 점이라면, 각 프레임은 자신이 포함한 샘플들을 decoding 하기 위한 포맷 정보를 포함하고 있다는 점이다. 그렇기에 wav가 포맷 헤더 없이는 전혀 내용을 이해하지 못하는 것과 달리 mp3는 데이터를 중간부터 받더라도 받은 부분부터 (정확히는 처음 만나는 frame의 시작부분부터) 재생할 수 있다. 즉 스트리밍이 가능하다.
실제로 decoder는 frame의 첫 부분을 찾아 자신에게 집어넣어서 pcm으로 만들어 소리를 출력하는 방식으로 작동한다.
다르게 말해서, mp3는 각각이 하나의 음원파일인 frame 파일들의 재생 리스트라고 볼 수 있다.
MP3 작성 시 결정해야 할 것(옵션)
bitrate : bits for second. 초당 저장해야 하는 압축 오디오 비트 수.
ex) 44.1khz, 16bit stereo의 PCM이라면 1411kbps (44.1*16*2 = 1411.2kbps).
MP3 에서는 원하는 bps를 골라서 압축할 수 있다. 32-320kbps를 사용할 수 있는데, 320이라고 해도 PCM의 1/4 정도의 용량이다.
일반적으로 사용되는 것은 128kbps, 192kbps 이다.
위에서 말했다 시피 MP3는 전체가 통일된 포맷을 사용하는게 아니라 블록 단위(frame)으로 나누어져 있다. 그 말인즉슨 각각의 frame은 다른 bitrate로 압축될 수도 있다는 말이다.
그래서 CBR(Constant bit rate, 전체 파일이 동일한 bitrate로 인코딩) 뿐만 아니라 VBR(Variable bit rate)도 존재한다. VBR은 압축 시에 판단하여 작게 압축해도 괜찮을 부분을 파악(여기에도 상당히 다양하고 어려운 알고리즘이 필요할 듯) 하여 낮은 bitrate로 압축한다. 그 결과로서 보다 적은 용량에, 동일한 퀄리티의 음질을 지닌 mp3 파일을 만들 수 있게 된다.
Audio Codec
이제 본격적으로 codec에 관한 이야기다.
codec은 다음 세 가지로 구분된다.
1. Encoder (coder) - PCM을 받아 압축된 결과물을 내보낸다
2. Decoder - 압축된 오디오를 받아 PCM으로 변환한다. (손실 압축이므로 원본과 달라질 수 있음)
3. Transcoding - decoding 후 다시 encoding 하는 것. 다른 codec을 사용하거나, 다른 bitrate로 압축.
Codec과 Container
코덱은 오디오 정보의 인코딩과 디코딩을 담당하는 일종의 프로그램 같은 것이다. 그리고 컨테이너는 그렇게 나온 오디오 정보를 담아 저장하는 것을 말한다.
WAV : file format (container)
MP3 : file format & codec
MP3는 하나의 파일 포맷인 동시에 코덱으로도 존재하기 때문에, wav는 사실 mp3 코덱으로 압축된 오디오 정보를 담을 수 있다.
.mp3 파일이란 mp3 코덱으로 압축된 오디오 데이터만을 담는 파일 포맷이라고 생각하면 될 것 같다.
즉 .mp3에 담긴 정보는 mp3 포맷이지만, mp3포맷이라고 해서 반드시 .mp3에 저장되지는 않는다는 것이다. 이 차이는 중요하지는 않더라도 의미는 있을 것 같다.
Lo-Fi Codec
주로 사람의 음성을 처리하는 데에 이용되는 코덱이다.
전화, 라디오, VOIP(voice over ip) 에 사용된다.
input으로는 일반적으로 낮은 sample rate 의 사운드가 들어온다. 16bit 8khz mono PCM(128kbps), 16bit 16khz mono PCM(256kbps) 등.
우선 순위(Priority)는 다음과 같다.
1. 낮은 bitrate
네크워크를 타고 오디오가 전송되게 되므로, 가능한 저용량이 되어야 한다.
2. 적은 latency
통화를 하는데 대기시간이 길다면 누구도 그것을 사용하지 않을 것이다. 최대한 딜레이가 적어야 한다.
3. 적은 연산량 (low cpu)
일반적으로 통신기기(전화 등)에 들어가는 cpu는 스펙이 낮기 때문에 고성능이면 곤란하다. 단 최근에는 이 문제는 줄어들었다.
4. 납득 가능한 품질 (acceptable quallity)
아무리 전화에 고성능이 필요하지 않다고 해도, 상대방의 말은 알아들을 수 있어야 통화로서 성립한다.
위는 대표적인 Lo-Fi 코덱들이다.
위 네 가지는 WAV 컨테이너에 포함될 수 있다. 아래의 speex는 ogg라는 컨테이너에서 사용된다.
Hi-Fi Codec
주로 음악이나 영화 등 고품질의 소리를 위해서 사용되는 코덱이다.
input은 보통 44.1khz 16bit stereo 처럼 고용량의 오디오가 들어온다.
우선순위는 다음과 같다.
1. 용량 줄이기
Lo-Fi와 마찬가지로, 코덱의 가장 큰 존재의의가 용량 감소인만큼 이쪽이 최우선이다. Wav와 mp3는 10배 이상 용량차이가 나는 경우도 어렵지 않게 볼 수 있다. 그렇다는 것은 같은 CD나 메모리에 보다 많은 오디오를 담을 수 있으며, 스트리밍 등을 하기에도 훨씬 좋다는 의미가 된다.
2. 오디오 퀄리티
성능을 너무 떨어트리면 안된다.
위는 대표적인 Hi-Fi 오디오 코덱이다.
AAC는 MP3의 후속작으로 모든 점에서 뛰어나지만, MP3만큼 퍼져있지 않은 탓에 보다 인기가 없다.
사용자가 AAC가 재생 가능한 기기를 가지고 있지 않으면 사용할 수 없기 때문이다.
FLAC는 비손실 압축이라는 장점이 있지만 그렇기에 용량이 크다.
Obtaining Codecs (코덱 얻기)
코덱을 사용하는 데에는 두 가지 방법이 있다.
1. standalone 코덱 사용하기
코덱 기능을 가진 별도의 프로그램을 사용하거나, 프로그래머라면 .lib를 이용해서 사용할 수 있다.
2. OS에 등록하기
외부에서 다운로드 받은 코덱을 OS에 추가할 수 있다. 추가된 코덱은 OS에 의해서 사용된다.
Windows Codec API
윈도우 OS에서 코덱을 사용하는 법. 윈도우 미디어 플레이어에선 이 방법을 쓰는데, 다른 프로그램도 같은 방법을 쓸지는 모르겠다. 너무 케바케일 것 같아서.
1. ACM (Audio Compression manager)
wav 재생 시, PCM이 아니고 압축 포맷이라면 코덱으로 디코딩을 해야 한다. wav의 format chunk에서 어떤 코덱을 쓰는지를 읽어내고 OS에 포함된 코덱들을 확인, 디코딩 가능한 코덱이 있으면 해당 코덱을 call 하여 PCM으로 만든다.
2. MFT (Media Foundation Transform)
비디오까지 지원하는 api.
3. DMO (Direct X Media Object)
어떤 코덱이 깔려있는지는 다음 방법으로 확인 가능하다.
윈도우 미디어 플레이어 상단에서 우클릭, 도움말-정보를 연다.
기술 지원 정보 클릭
열린 html 파일에서 오디오 코덱을 찾는다.
MFT 는 비디오 코덱으로 분류되는지 나오지 않는다.
코덱 선택하기
오디오 파일을 제작할 때 어떤 코덱을 사용하는 것이 좋을 것인가?
아래와 같은 사항을 고려해서 선택하는 것이 좋다.
1. Bitrate / quality trade off.
성능이 늘어나면 용량도 늘어난다. 용량을 낮추면 성능도 낮아진다. 자신의 목적을 알고 코덱을 골라야 한다.
고성능 퀄리티를 원한다면 PCM / FLAC (원본이거나 무손실 압축)
스트리밍을 원한다면 MP3 , AAC
딜레이 없는 목소리를 원한다면 OPUS, speex
2. 재생 가능한가?
제작자 입장에서는 그 어떤 코덱과 포맷도 재생 가능하다. 없으면 설치하면 된다.
그러나 사용자 입장에서는 자신이 사용하는 기기가 지원하지 않는 포맷은 사용할 수 없다. 설치는 안 되거나 귀찮을 것이다.
MP3의 업그레이드 버전인 AAC가 있음에도 MP3 가 쇠락하지 않고 오히려 AAC가 인지도가 떨어지는 이유가 그것이다. MP3가 재생되지 않는 기기는 없으니까. (뭐 전문가들 사이에선 mp3가 구식취급이고, 유투브도 AAC를 사용한다고는 한다)
아무리 좋은 성능의 코덱을 개발했다고 해도 사용자들이 그걸 디코딩할 수 있는 기기가 없다면 (코덱이 널리 퍼져있지 않다면) 그 코덱을 사용하기는 어려울 것이다.
3. 비용이 발생하는가?
다수의 포맷은 비용을 요구한다. 실제로 가장 유명한 mp3 도 유료 포맷이고, 특허가 끝난 게 고작 3년 전이다. 그렇기 때문에 지원이 중단되어서 언젠가는 AAC에 밀려날 것이라고는 하지만... (그러나 우리는 아직도 많은 기업이 지원 끝난지 6년 된 xp를 계속 쓴다는 걸 알고 있다. 명작은 그 안정성 때문에라도 쉽게 밀려나지 않는다. 사고가 터지지 않는 한. 그러나 음원 포맷에 무슨 큰 이슈가 있을까? 보안도 없는데.)
아무튼, mp3 등은 비용 청구 조건이 완만하고(일정 금액 이하 무료 등) 하여 사용하기 쉽지만(그래서 널리 퍼졌다) 일부 포맷은 걍 유료인 것도 있겠구나 싶다.
사용 목적에 따라, 유료 포맷을 써야 할, 혹은 써도 될 상황인지 판단할 필요가 있겠다.
'개발언어 > NAudio' 카테고리의 다른 글
[Digital Audio] 4. Audio Signal Chains (0) | 2021.07.08 |
---|---|
[Digital Audio] 3. Audio Effect (0) | 2021.07.08 |
[Digital Audio] 1. Audio Sampling (0) | 2021.07.08 |
[NAudio] 반복재생하기 (0) | 2021.07.08 |
[NAudio] 재생 속도 조절 (0) | 2021.07.08 |