1. 程式人生 > >WAVE檔案的頭格式(例如PCM檔案)

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處理獲取的資料