一、前言
當前Visual C++相關的編程資料中,無論是大部頭的參考書,還是一些計算機雜志,對聲音文件的處理都是泛泛的涉及一下,許多編程愛好者都感到對該部分的內容了解不是很透徹,本文希望能夠給剛剛涉及到聲音處理領域的朋友們起到一個引路的作用,幫助他們盡快進入聲音處理的更深奧空間。
當前計算機系統處理聲音文件有兩種辦法:一是使用現成的軟件,如微軟的錄音機、SoundForge、CoolEdit等軟件可以實現對聲音信號進行錄音、編輯、播放的處理,但它們的功能是有限的,為了更靈活,更大限度地處理聲音數據,就不得不使用另外一種方法,既利用微軟提供的多媒體服務,在Windows環境下自己編寫程序來進行聲音處理來實現一些特定的功能。下面就開始介紹聲音文件的格式和在Windows環境下使用Visual C++開發工具進行聲音文件編程處理的方法,本文所有的程序代碼都在Windows2000、Visual C++6.0環境下編譯通過,運行正常。
二、RIFF文件結構和WAVE文件格式
Windows支持兩種RIFF(Resource Interchange File Format,"資源交互文件格式")格式的音頻文件:MIDI的RMID文件和波形音頻文件格式WAVE文件,其中在計算機領域最常用的數字化聲音文件格式是後者,它是微軟專門為Windows系統定義的波形文件格式(Waveform Audio),由於其擴展名為"*.wav",因而該類文件也被稱為WAVE文件。為了突出重點,有的放矢,本文涉及到的聲音文件所指的就是WAVE文件。常見的WAVE語音文件主要有兩種,分別對應於單聲道(11.025KHz采樣率、8Bit的采樣值)和雙聲道(44.1KHz采樣率、16Bit的采樣值)。這裡的采樣率是指聲音信號在進行"模→數"轉換過程中單位時間內采樣的次數。采樣值是指每一次采樣周期內聲音模擬信號的積分值。對於單聲道聲音文件,采樣數據為八位的短整數(short int 00H-FFH);而對於雙聲道立體聲聲音文件,每次采樣數據為一個16位的整數(int),高八位和低八位分別代表左右兩個聲道。WAVE文件數據塊包含以脈沖編碼調制(PCM)格式表示的樣本。在進行聲音編程處理以前,首先讓我們來了解一下RIFF文件和WAVE文件格式。
RIFF文件結構可以看作是樹狀結構,其基本構成是稱為"塊"(Chunk)的單元,每個塊有"標志符"、"數據大小"及"數據"所組成,塊的結構如圖1所示:
塊的標志符(4BYTES)
數據大小 (4BYTES)
數據
圖一、 塊的結構示意圖
從上圖可以看出,其中"標志符"為4個字符所組成的代碼,如"RIFF","LIST"等,指定塊的標志ID;數據大小用來指定塊的數據域大小,它的尺寸也為4個字符;數據用來描述具體的聲音信號,它可以由若干個子塊構成,一般情況下塊與塊是平行的,不能相互嵌套,但是有兩種類型的塊可以嵌套子塊,他們是"RIFF"或"LIST"標志的塊,其中RIFF塊的級別最高,它可以包括LIST塊。另外,RIFF塊和LIST塊與其他塊不同,RIFF塊的數據總是以一個指定文件中數據存儲格式的四個字符碼(稱為格式類型)開始,如WAVE文件有一個"WAVE"的格式類型。LIST塊的數據總是以一個指定列表內容的4個字符碼(稱為列表類型)開始,例如擴展名為".AVI"的視頻文件就有一個"strl"的列表類型。RIFF和LIST的塊結構如下:
RIFF/LIST標志符
數據1大小
數據1 格式/列表類型
數據
圖二、RIFF/LIST塊結構
WAVE文件是非常簡單的一種RIFF文件,它的格式類型為"WAVE"。RIFF塊包含兩個子塊,這兩個子塊的ID分別是"fmt"和"data",其中"fmt"子塊由結構PCMWAVEFORMAT所組成,其子塊的大小就是sizeofof(PCMWAVEFORMAT),數據組成就是PCMWAVEFORMAT結構中的數據。WAVE文件的結構如下圖三所示:
標志符(RIFF)
數據大小
格式類型("WAVE")
"fmt"
Sizeof(PCMWAVEFORMAT)
PCMWAVEFORMAT
"data"
聲音數據大小
聲音數據
圖三、WAVE文件結構圖
PCMWAVEFORMAT結構定義如下:
Typedef struct
{
WAVEFORMAT wf;//波形格式;
Word wBitsPerSample;//WAVE文件的采樣大小;
}PCMWAVEFORMAT;
WAVEFORMAT結構定義如下:
typedef struct
{
Word wFormatag;//編碼格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
Word nChannls;//聲道數,單聲道為1,雙聲道為2;
DWord nSamplesPerSec;//采樣頻率;
DWord nAvgBytesperSec;//每秒的數據量;
Word nBlockAlign;//塊對齊;
}WAVEFORMAT;
"data"子塊包含WAVE文件的數字化波形聲音數據,其存放格式依賴於"fmt"子塊中wFormatTag成員指定的格式種類,在多聲道WAVE文件中,樣本是交替出現的。如16bit的單聲道WAVE文件和雙聲道WAVE文件的數據采樣格式分別如圖四所示:
16位單聲道:
16位單聲道:
采樣一 采樣二 ……
低字節 高字節 低字節 高字節 ……
16位雙聲道:
采樣一 ……
左聲道 右聲道 ……
低字節 高字節 低字節 高字節
圖四、WAVE文件數據采樣格式
三、聲音文件的聲音數據的讀取操作
操作聲音文件,也就是將WAVE文件打開,獲取其中的聲音數據,根據所需要的聲音數據處理算法,進行相應的數學運算,然後將結果重新存儲與WAVE格式的文件中去。可以使用CFILE類來實現讀取操作,也可以使用另外一種方法,拿就是使用Windows提供的多媒體處理函數(
[1] [2] [3] [4] [5] 下一頁