wav檔案的檔案頭

safrans發表於2012-09-18

wav檔案的檔案頭

wave檔案的格式:
00H 4 char "RIFF"標誌
04H 4 long int 檔案長度
08H 4 char "WAVE"標誌
0CH 4 char "fmt"標誌
10H 4   過渡位元組(不定)
14H 2 int 格式類別(10H為PCM形式的聲音資料)
16H 2 int 通道數,單聲道為1,雙聲道為2
18H 2 int 取樣率(每秒樣本數),表示每個通道的播放速度,
1CH 4 long int 波形音訊資料傳送速率,其值為通道數×每秒資料位數×每樣
本的資料位數/8。播放軟體利用此值可以估計緩衝區的大小。
20H 2 int 資料塊的調整數(按位元組算的),其值為通道數×每樣本的資料位
值/8。播放軟體需要一次處理多個該值大小的位元組資料,以便將其
值用於緩衝區的調整。
22H 2   每樣本的資料位數,表示每個聲道中各個樣本的資料位數。如果有多
個聲道,對每個聲道而言,樣本大小都一樣。
24H 4 char 資料標記符"data"
28H 4 long int 語音資料的長度

檔案頭長度加起來是42位元組,但是實際長度是44個位元組(用UltraEdit開啟一個WAVE檔案,數一下就知道了)。如果用以個結構體來定義WAVE檔案頭應該為:
struct WAVEFILEHEADER
{
char chRIFF[4];
DWORD dwRIFFLen;
char chWAVE[4];
char chFMT[4];
DWORD dwFMTLen;
PCMWAVEFORMAT pwf;
char chDATA[4];
DWORD dwDATALen;
};

但是實際測試,並不是所有的wave檔案頭都一樣。比較麻煩的就是windows下自帶的那個錄音機錄下的wav,檔案頭有58個 Byte。所以,比較好的辦法是,首先讀取n長的一段字元,例如60個;然後從中查詢關鍵字“data”,“data”之後的一個DWORD是實際音訊數 據的長度,得到這個長度len,再從這DWORD後開始讀取len個位元組,就可以讀到檔案尾。如果是雙聲道的,那麼資料是交替存放的;如果是16bit採 樣的,每兩個位元組會以小端的方式儲存一個AD值。根據這樣的方式,就可以順利讀取音訊資料了。

原文地址:http://www.cnblogs.com/huaping-audio/archive/2010/03/08/1680654.html

相關文章