WAVE檔案的頭格式(例如PCM檔案)
wav檔案包括頭和資料兩部分,其結構如下:(從檔案頭開始依次排列)
1)首先是字串“RIFF” ,佔4個位元組。
2)波形塊的大小:DWORD,佔4位元組。波形塊的大小=(檔案大小-8)
3)字串"WAVE",佔4個位元組。
4)字串“fmt ”,佔4個位元組,注意fmt後有個空格字元(0x20)。
5)格式塊的大小,DWORD,佔4個位元組
6)格式塊,VC中用WAVEFORMATEX結構體描述,佔18個位元組,可用sizeof(WAVEFORMATEX)計算。
其中WAVEFORMATEX結構體的定義為:(更詳細的描述可以參考msdn)
typedef struct tWAVEFORMATEX
{
WORD wFormatTag; /* format type */
WORD nChannels; /* number of channels (i.e. mono, stereo...) */
DWORD nSamplesPerSec; /* sample rate */
DWORD nAvgBytesPerSec; /* for buffer estimation */
WORD nBlockAlign; /* block size of data */
WORD wBitsPerSample; /* number of bits per sample of mono data */
WORD cbSize; /* the count in bytes of the size of */
/* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
7)字串"data",佔4個位元組。
8)波形資料的大小,DWORD,佔4個位元組。
9)聲音資料,大小在8)中描述。
以下是一個波形檔案樣本的頭部:
00000000h: 52 49 46 46 E6 E4 05 00 57 41 56 45 66 6D 74 20; RIFF驛..WAVEfmt
00000010h: 12 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00 ; [email protected]? >..
00000020h: 02 00 10 00 00 00 64 61 74 61 C0 E4 05 00 ; ......data冷..
從該樣本可以看出:
該波形檔案波形塊的大小為386278(0x0005E4E6),波形檔案大小為:386278+8 =386286位元組;
格式塊的大小(WAVEFORMATEX結構體)為18位元組;
波形資料的大小為386240位元組(0x0005E4C0);
就是說你想要的資料應該就在這兩個資料其中一個
格式塊(WAVEFORMATEX結構體)中定義的聲音資料屬性為:
wFormatTag=0x0001 即WAVE_FORMAT_PCM ;
nChannels = 0x0001 即單聲道;
nSamplesPerSec = 0x00001F40 即取樣率8000Hz;
nAvgBytesPerSec = 0x00003E80 即平均位元組速率16000位元組(16bit量化),可以根據該資料估計緩衝區的大小;
nBlockAlign = 0x0002 即塊聯合為2位元組(16bit量化,2位元組表示一個取樣點,播放時必須從以塊為單位從塊頭開始播放);
wBitsPerSample = 0x0010 即每個取樣點的位元值為16(16bit量化)。nBlockAlign值即由該值除以8計算出來;
cbSize不使用,填0x0000。
聲音資料就是通過MM_WIM_DATA處理獲取的資料