WAVE文件作爲多媒體中使用的聲波文件格式之一,它是以RIFF格式爲標準的。RIFF是英文Resource Interchange File Format的縮寫,每個WAVE文件的頭四個字節便是“RIFF”。WAVE文件由文件頭和數據體兩大部分組成。其中文件頭又分爲RIFF/WAV文件標識段和聲音數據格式說明段兩部分。WAVE文件各部分內容及格式見附表。
常見的聲音文件主要有兩種,分別對應於單聲道(11.025KHz採樣率、8Bit的採樣值)和雙聲道(44.1KHz採樣率、16Bit的採樣值)。採樣率是指:聲音信號在“模→數”轉換過程中單位時間內採樣的次數。採樣值是指每一次採樣週期內聲音模擬信號的積分值。
對於單聲道聲音文件,採樣數據爲八位的短整數(short int 00H-FFH);而對於雙聲道立體聲聲音文件,每次採樣數據爲一個16位的整數(int),高八位和低八位分別代表左右兩個聲道。
WAVE文件數據塊包含以脈衝編碼調製(PCM)格式表示的樣本。WAVE文件是由樣本組織而成的。在單聲道WAVE文件中,聲道0代表左聲道,聲道1代表右聲道。在多聲道WAVE文件中,樣本是交替出現的。
WAVE文件格式說明表
偏移地址 字節數 數據類型 內 容
文件頭
00H 4 char "RIFF"標誌
04H 4 long int 文件長度
08H 4 char "WAVE"標誌
0CH 4 char "fmt"標誌
10H 4 過渡字節(不定)
14H 2 int 格式類別(0001H爲WAVE_FORMAT_PCM形式的聲音數據)
16H 2 int 通道數,單聲道爲1,雙聲道爲2
18H 2 int 採樣率(每秒樣本數),表示每個通道的播放速度, (Hz) sample frequency
1CH 4 long int 波形音頻數據傳送速率,其值爲通道數×每秒樣本數×每樣本的數據位數(bit)/8。播放軟件利用此值可以估計緩衝區的大小。
20H 2 int 數據塊的調整數(按字節算的),其值爲通道數×每樣本的數據位值/8。播放軟件需要一次處理多個該值大小的字節數據,以便將其值用於緩衝區的調整。
22H 2 每樣本的數據位數,表示每個聲道中各個樣本的數據位數。如果有多個聲道,對每個聲道而言,樣本大小都一樣。
24H 4 char 數據標記符"data" ,“64 61 74 61”這個是Ascii字符“data”,標示頭結束,開始數據區域。
28H 4 long int 語音數據的長度 --2BH 44Byte
文件頭長度加起來是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值。根據這樣的方式,就可以順利讀取音頻數據了。
PCM數據的存放方式:
樣本1 樣本2
8位單聲道 0聲道 0聲道
8位立體聲 0聲道(左) 1聲道(右) 0聲道(左) 1聲道(右)
16位單聲道 0聲道低字節 0聲道高字節 0聲道低字節 0聲道高字節
16位立體聲 0聲道(左)低字節 0聲道(左)高字節 1聲道(右)低字節 1聲道(右)高字節
WAVE文件的每個樣本值包含在一個整數i中,i的長度爲容納指定樣本長度所需的最小字節數。首先存儲低有效字節,表示樣本幅度的位放在i的高有效位上,剩下的位置爲0,這樣8位和16位的PCM波形樣本的數據格式如下所示。
樣本大小 數據格式 最大值 最小值
8位PCM unsigned int 225 0
16位PCM int 32767 -32767