WAV文件格式剖析

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章