歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 編寫Windows下的G.729插件

編寫Windows下的G.729插件

日期:2017/3/6 15:24:24   编辑:關於Unix
不知道為什麼Windows 附帶G.723的插件,卻沒有G.729的,很是郁悶。於是花了不少時間寫了個,一直都是在 Linux 編程,到了Windows 下反而很不習慣,本來應該更方便的東西反倒搞得很復雜,教訓大le 需要准備的東西:G.729的代碼或者連接庫(VoiceAge提供免費的

不知道為什麼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目錄下,然後把相關信息寫入注冊表,就可以使用了。

Copyright © Linux教程網 All Rights Reserved