1. 程式人生 > >WAV格式音訊檔案標頭檔案格式以及C++讀取

WAV格式音訊檔案標頭檔案格式以及C++讀取

起始地址

佔用空間

本地址數字的含義

00H

4byte

RIFF,資源交換檔案標誌。

04H

4byte

從下一個地址開始到檔案尾的總位元組數。高位位元組在後面,這裡就是001437ECH,換成十進位制是1325036byte,算上這之前的8byte就正好1325044byte了。

08H

4byte

WAVE,代表wav檔案格式。

0CH

4byte

FMT ,波形格式標誌

10H

4byte

00000010H,16PCM,我的理解是用16bit的資料表示一個量化結果。

14H

2byte

為1時表示線性PCM編碼,大於1時表示有壓縮的編碼。這裡是0001H。

16H

2byte

1為單聲道,2為雙聲道,這裡是0001H。

18H

4byte

取樣頻率,這裡是00002B11H,也就是11025Hz。

1CH

4byte

Byte率=取樣頻率*音訊通道數*每次取樣得到的樣本位數/8,00005622H,也就是22050Byte/s=11025*1*16/2。

20H

2byte

塊對齊=通道數*每次取樣得到的樣本位數/8,0002H,也就是2=1*16/8。

22H

2byte

樣本資料位數,0010H即16,一個量化樣本佔2byte。

24H

4byte

data,一個標誌而已。

28H

4byte

Wav檔案實際音訊資料所佔的大小,這裡是001437C8H即1325000,再加上2CH就正好是1325044,整個檔案的大小。

2CH

不定

量化資料。


利用C的檔案流進行WAV格式音訊檔案的讀取,根據WAV檔案的格式定義了一個檔案頭結構體如下:

struct WaveFileHead
{
	char   riff_id[4];     //"RIFF"
	int    size0;          //波形塊的大小
	char   wave_fmt[8];    //"wave" and "fmt"
	int    size1;          //格式塊的大小
	short  fmttag;         //波形編碼格式
	short  channel;        //波形檔案資料中的通道數
	int    sampl;          //波形檔案的取樣率
	int    bytepersecblockalign;  //平均每秒波形音訊所需要的記錄的位元組數
    short  blockalign;      //一個取樣所需要的位元組數
    short  bitpersamples;   //聲音檔案資料的每個取樣的位數
	char   data[4];         //"data"
	int    datasize;        //資料塊大小
};


建立一個WaveFileHead型別物件wavehead,通過wavehead來讀取音訊檔案的檔案頭中的各種資訊,並根據該資訊來進行音訊檔案資料的讀取,相關讀取方法如下:
  
  fread(&wavehead,sizeof(struct WaveFileHead),1,fp);//讀取檔案頭存入wavehead


建立*pdata指標用於儲存檔案的資料塊部分:
    fread(pdata,sizeof(short),wavehead.datasize/2,fp) //讀取資料存入pdata指標