wav 파일 구조
주의 : Wav에 대한 헤더(WAVEFORMATEX) 가 아니라, Wav파일(**.wav) 에 대한 헤더입니다.
class WaveHeader
{
public:
char ChunkID[4];
unsigned int ChunkSize;
char Format[4];
char SubChunk1ID[4];
unsigned int SubChunk1Size;
short AudioFormat;
short NumChannels;
unsigned int SampleRate;
unsigned int ByteRate;
short BlockAlign;
short BitsPerSample;
char SubChunk2ID[4];
unsigned int SubChunk2Size;
};
위 헤더를 한번에 읽어들이면, Endian에 맞게 읽을 수 있습니다.
각 요소에 대한 설명
— Chunk의 시작 —
- ChunkID (4byte) : “RIFF” 고정 문자열입니다.
- ChunkSize(4byte) : ChunkID와 ChunkSize를 제외한 파일의 크기입니다.
전체 파일크기 -8 byte에 해당합니다.
— Chunk의 끝 —
- Format (4byte) : “WAVE” 고정 문자열입니다.
–SubChunk1의 시작–
- SubChunk1ID(4byte) : “fmt ” 고정 문자열입니다.
- SubChunk1Size(4byte) : SubChunk1의 크기입니다. 16byte고정입니다.
–SubChunk1의 끝–
- AudioFormat(2byte) : 일반적인 경우인 PCM은 1의 값을 가집니다.
- NumChannels(2byte) : 채널의 수 입니다. 모노는 1, 스테레오는 2입니다.
- SampleRate(4byte) : 샘플링 주파수입니다. (Ex, 22Khz 44Khz 등).
- ByteRate(4byte) : 1초에 해당하는 전체 샘플 Byte수입니다.
- 주파수 * 채널 * 비트수 / 8에 해당합니다.
- BlockAlign(2byte) : ByteRate를 계산하기 편하게 하기 위한 수입니다.
- 채널 * 비트수 / 8이며, 스테레오 8bit면 2, 모노 8bit면 1, 모노 16bit면 2입니다.
- BitsPerSample(2byte) : 하나의 Sample에 대한 bit수 입니다. 8bit 나 16bit등이 들어갑니다.
–SubChunk2의 시작–
- SubChunk2ID(4byte) : “data” 고정 문자열입니다.
- SubChunk2Size(4byte) : 실제 PCM데이터의 크기가 들어갑니다.
–SubChunk2의 끝–
이후부터 실제 PCM데이터가 나열됩니다.