不知道為什麼Windows附帶G.723的插件,卻沒有G.729的,很是郁悶。於是花了不少時間寫了個,一直都是在Linux編程,到了Windows下反而很不習慣,本來應該更方便的東西反倒搞得很復雜,教訓大le
需要准備的東西:G.729的代碼或者連接庫(VoiceAge提供免費的庫),Win DDK。
因為在Windows中音頻的存儲格式一般都是wav,所以首先要了解wav的文件格式,有專門的文章介紹這個,在這裡就不多說了。G.729的wav格式可參考這個
WAVEFORMATED FormatG729 =
{
WAVE_FORMAT_MSG729, // wFormatTag,微軟定義了很多wav的標簽,這是其中一個(44),但是在我的系統裡編譯的時候卻找不到這個標簽,所以我用了另外一個,詳細定義可查看mmreg.h這個文件
1, // nChannels,單聲道/多聲道,1表示單聲道
8000, // nSamplesPerSec,采樣頻率
1000, // nAvgBytesPerSec,碼率,我用的是8kbits/s的編解碼
10, // nBlockAlign,字節為單位,因為編碼源是160字節為單位的pcm16bit的音頻流,按16:1的壓縮率,編碼後就是10字節
0, // wBitsPerSample,沒用
2 // cbSize,一般就是wSamplesPerBlock(我用的是80)的長度,
}
這個更詳細的介紹可以在微軟的msdn關於如何編寫acm driver的文章裡找到。
接下來就要用win ddk了,記住一定要裝上windbg,很好用的調試工具。不過在調試狀態下錄音然後放出來的聲音都是噪音,很受不了。
首先要選好跟你的系統匹配的編譯環境。接下來就要寫sources文件,類似Linux下的makefile文件,定義一下連接庫,源文件等,在ddk中找個范例修改一下就好了。還有幾個必須的文件如makefile、安裝信息文件、rcv文件、resource template文件、def文件都是參考范例寫一下就好了。文件齊備了後,直接build就好了。
ACM是一個通用的音頻編解碼管理器,所以有固定的接口函數:DriverProc,調用插件函數入口;
幾個主要的消息:DRV_OPEN,打開插件;DRV_CLOSE,關閉插件;DRV_CONFIGURE,配置插件;ACMDM_STREAM_OPEN,確定是編碼流還是解碼流;ACMDM_STREAM_CLOSE,關閉音頻流;ACMDM_STREAM_CONVERT,調用編/解碼函數。
編碼時,一般輸入的是pcm16bit的音頻流。解碼輸出的也應該是pcm16bit的音頻流,如果是8bit的,還需要進行轉換。
G.729的編解碼函數因為版權問題,我就不細說了,只要設定好匹配的參數(如碼率,samplesperblock等),然後封裝好填寫到stream open消息的處理函數中就行了。
編譯通過後你會得到一個*.acm的文件,把它拷貝到win/system32目錄下,然後把相關信息寫入注冊表,就可以使用了。