멀티미디어 파일들을 읽기 위해서는 대부분 복잡한 포맷형식 때문에 이미 만들어진 라이브러리들을 통하여 읽는 것이 일반적이다. 하지만 PCM형식의 WAV파일은 비교적 간단하기 때문에 손쉽게 읽을 수 있을 것이라 생각된다.
WAV파일의 DFT변환을 위해 WAV파일의 저장된 내용을 읽을 필요가 있었는데.. 실제 음파의 값들을 읽을수 있는 라이브러리를 찾다가 직접 WAV파일을 읽는 프로그램을 작성하더라도 큰 어려움이 없을 것같아 만들어 보았다.
우선 PCM WAV파일의 포맷부터 보자..
이름 | 형식 | 값 | |
Chunk Head | Chunk ID | 4 Bytes ASCII String | “RIFF” - MS에서 사용하는 멀티미디어를 저장하는 포맷으로 항상RIFF라 생각하면 됩니다. |
Chunk Size | 4 Bytes Little Endian | 전체파일의 총 길입니다. | |
Format | 4 Bytes ASCII String | “WAVE” - WAV파일일 경우 | |
Sub Chunk 1 | Sub Chunk 1 ID | 4 Bytes ASCII String | “fmt “ - WAV파일일 경우 |
Sub Chunk 1 Size | 4 Bytes Little Endian | Sub Chunk1의 길이 | |
Audio Format | 2 Bytes Little Endian | 1 – PCM | |
Number of Channels | 2 Bytes Little Endian | 1 – Mono 2 – Stereo | |
Sample Rate | 4 Bytes Little Endian | 8000, 22000, 44000…… 등등 | |
Byte Rate | 4 Bytes Little Endian | (Sample Rate) * (Number of Channels) * (Bit Per Samples) / 8 | |
Block Align | 2 Bytes Little Endian | (Number of Channels) * (Bit Per Samples) / 8 | |
Bit Per Sample | 2 Bytes Little Endian | 8 또는 16 | |
Extra Pram Size(선택적) | 2 Bytes Little Endian | PCM의 경우는 사용하지 않음 | |
Extra Pram(선택적) | N Bytes | 확장 옵션을 위해 | |
Sub Chunk 2 | Sub Chunk 2 ID | 4 Bytes ASCII String | “data” |
Sub Chunk 2 Size | 4 Bytes Little Endian | Sub Chunk 2의 크기 | |
Data | N Bytes | 실제 사운드 데이터 스테레오의 경우 좌 샘플 하나 우 샘플 하나씩 번갈아 가며 저장됨. |
PCM의 경우 압축을 사용하지 않으므로 매우 간단하게 읽을 수 있다.
수치 값들은 모두 Little Endian으로 저장되며 모두 Unsigned 값들이다. 실수만 하지 않는 다면 간단하게 읽을 수 있을 것이다.
이곳으로 가면 조금더 자세한 WAV형식에 대한 설명을 볼 수 있습니다.
http://ccrma.stanford.edu/courses/422/projects/WaveFormat/
C#으로 작성해 보았으며 PCM형식의 WAV파일들의 값을읽습니다. 아 그리고 아래 소스는 실행가능 한 코드가 아니고 프로그램의 일부입니다..
또한 스트레오의 필요가 없어서 스트레오의 경우 모노로 바꾸어 읽어 버립니다..