상세 컨텐츠

본문 제목

Wave 파일 구조

멀티미디어/사운드(Sound)

by cepiloth 2018. 9. 4. 21:05

본문

728x90
반응형




 마이크로소프트 윈도우즈 OS 표준 사운드 포맷으로 확장자는 'wav'이다. PCM(Pulse Code Modulation 펄스부호 변조 방식)형태의 데이터 앞쪽에 헤더가 붙어 있는 형태이다. 헤더에는 표본화율, 양자와 비트, 채널 숫자, 파일 길이, 코딩 방식등에 대한 정보들이 포함되어 있다.




 

0~44Byte까지는 Header고 가장 밑에 실제 데이터가 있는 것을 볼 수 있습니다.

wav 파일의 경우, chunk라고 하는 몇 개의 덩어리가 있습니다.

맨 처음 부분이 RIFF Chunk로 이 부분은 

이 파일이 RIFF 파일 형식이라는 걸 말해줍니다.

 

RIFF는 Resource InterChange File Format으로 avi나 wav같은 파일 형식을

 

나타내기 위해서 사용합니다. 

 

그럼 본격적으로 순서대로 설명을 해보겠습니다.

 

① Chunk ID : 여기에는 'RIFF' 가 들어가게 됩니다.(0x52494646 Big-Endian이라 순서대로 RIFF입니다.)

 

② Chunk Size : 파일 크기에서 Chunk ID와 Chunk Size(8) 만큼 뺀 값으로,   

파일 크기 - 8입니다.

Little-Endian이기 때문에 0x24080000 으로 되어 있으면

거꾸로 0x00000824로 되어 파일 크기는 2084가 됩니다.

 

③ Format : 파일의 포맷입니다. wav파일의 경우는 대문자로 'WAVE'가 들어갑니다.

Big-Endian으로 기록되기 때문에 그냥 'WAVE'로 저장됩니다.

 

④ Subchunk1 ID : 여기는 첫번째 Sub chunk로 재생에 필요한 해당 PCM의 형식을

저장하는 chunk의 시작부분입니다. 

여기에는 'fmt '가 들어가는데 fmt 뒤에 공백이 있습니다. 

즉, 0x666d7420가 Big-Endian으로 기록됩니다. 

 

⑤ Subchunk1 Size : Subchunk1 Size는 실제 기록되는 데이터 포맷의 크기로

이 영역 밑에 기록된 Subchunk1의 크기를 나타내며 16 사이즈를 갖습니다.

Little-Endian으로 0x10000000 입니다. 

 

⑥ AudioFormat : PCM의 경우 1입니다. 주의하실 것은 이 부분은 크기가 2바이트 입니다.

Little-Endian으로 0x0100 입니다.

 

⑦ NumChannels : 채널 수 입니다. Mono는 1, Stereo는 2입니다.

이 부분도 2바이트로 구성되어 있으며, Stereo의 경우 0x0200입니다.(Little-Endian) 

 

⑧ SampleRate : Sample Rate로 1초를 몇 개의 조각으로 세분화할 것인지입니다.

4바이트로 구성되며, 22050의 경우에는 0x00005622인데 Little-Endian으로 0x22560000이

됩니다. 

 

⑨ ByteRate : 이것은 SampleRate * NumChannels * BitsPerSample / 8

구해집니다. BitsPerSample은 각 샘플을 몇개의 비트로 표현하는가 입니다.

ByteRate는 쉽게 말하면 1초의 소리가 차지하는 바이트 수입니다.

SampleRate가 22050이며, Stereo(2)이며, 한 샘플을 16bit로 표현하면 

22050 * 2 * 16 / 8 = 88280이 됩니다.

4바이트 Little-Endian으로 되어 있기 때문에 0x88580100이 됩니다. 

 

 BlockAlign : 전체 채널을 포함하는 한 샘플의 크기입니다.

채널이 2개(Stereo)면서, BitPerSample(샘플당 비트수)가 16bit이면

2 * 16 / 8(byte로 변환하기 위해서)입니다.

즉, 크기는 4가 되고 Little-Endian 방식으로 2바이트로 표현되므로 0x0400이 됩니다.

 

⑪ BitsPerSample : 위에 설명했듯이, 샘플당 비트수입니다.

1초를 샘플로 나누고 각각의 샘플을 몇 개의 비트로 표현할 지를 나타냅니다.

비트수가 커질 수록 음질은 나아지겠지만 용량을 그만큼 많이 차지하게 됩니다.

2바이트 Little-Endian 방식으로 표현되므로 16bit의 경우에는 0x1000이 됩니다. 

 

⑫ Subchunk2 ID : 'data'가 들어가며, 모든 문자열과 같이, Big-Endian으로 들어갑니다.

즉, 0x64617461이 들어갑니다. 

 

⑬ Subchunk2 Size : Subchunk2의 사이즈.

즉 실제 PCM 데이터의 사이즈가 들어갑니다.

(BitsPerSample / 8) * NumChannels * 실제 샘플수로 계산됩니다.

 

⑭ Data : 실제 PCM 데이터입니다.




 

* 한계점 

1. 4GB 이상의 Wave 파일을 만들 수 없다.

 

SubChunk2 Size가 4바이트로 구성되어 있기 때문에

4GB(Format 포함하면 이보다 더 작은) 이상의 크기를 담을 수 없습니다. 

 

2. Information Field가 존재하지 않는다.

 

FLAC이나 MP3같은 경우는 곡 정보를 포함할 수 있지만 wave 에서는 기능 미존재.


728x90
반응형

댓글 영역