整個wave主要分為三個區塊:
區塊名稱 | 說明 |
RIFF |
Wikipedia – RIFF |
FMT |
音樂格式 |
DATA |
音樂資料 |
RIFF區塊
檔案位置(byte) | 所需大小(byte) | 備註 | |
ChunkID | 0 | 4 | "RIFF" |
ChunkSize | 4 | 4 | 檔案長度 – ChunkID & ChunkSize所佔的長度 |
Format | 8 | 4 | "WAVE" |
FMT區塊
檔案位置(byte) | 所需大小(byte) | 備註 | |
SubChunk1 ID | 12 | 4 | "fmt " |
SubChunk1 Size | 16 | 4 | 若是PCM, 則為16, 可由此推斷是否有附加訊息 |
AudioFormat | 20 | 2 | 編碼格式, 通常為0x0001(PCM) |
NumChannels | 22 | 2 | 頻道數, Mono = 1, Stereo = 2, etc. |
SampleRate | 24 | 4 | 採樣頻率, 8000, 44100, etc. |
ByteRate | 28 | 4 | 每秒所需byte |
BlockAlign | 32 | 2 | 資料區塊對齊單位 |
BitsPreSample | 34 | 2 | 每個採樣的bit |
ExtraParamSize | 2 | 若是屬於PCM, 則沒有額外資料 | |
ExtraParams | x |
DATA區塊
檔案位置(byte) | 所需大小(byte) | 備註 | |
Subchunk2 ID | 36 | 4 | "data" |
Subchunk2 Size | 40 | 4 | == NumSamples * NumChannels * BitsPerSample/8 |
Data | 44 | * |
結構
RIFF |
struct RIFF_HEADER { cahr szRiffID[4]; // ‘RIFF’ DWORD dwRiffSize; char szRiffFormat[4]; // ‘WAVE’ }; |
FMT |
struct WAVE_FORMAT { char szFmtID[4]; // ‘fmt ‘, 注意這邊有一個空格 DWORD dwFmtSize; WORD wFormatTag; WORD wChannels; DWORD dwSamplesPerSec; DWORD dwAvgBytesPerSec; WORD wBlockAlign; WORD wBitsPerSample; }; |
DATA |
struct DATA_BLOCK { char szDataID[4]; // ‘data’ DWORD dwDataSize; }; |
小結
嗯~這次沒有想多說什麼
◎參考:
wav文件格式分析详解
WAVE PCM soundfile format
PCM Audio and Wave Files