编写Windows下的G.729插件

发表于:2007-07-04来源:作者:点击数: 标签:
不知道为什么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目录下,然后把相关信息写入注册表,就可以使用了。

原文转自:http://www.ltesting.net