WAV格式音訊檔案標頭檔案格式以及C++讀取
阿新 • • 發佈:2019-01-07
起始地址 |
佔用空間 |
本地址數字的含義 |
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指標