Qaupot Blog
Software Engineering, Trip

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데이터가 나열됩니다.

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.