分类: LINUX
2005-08-12 16:03:43
不知道为什么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目录下,然后把相关信息写入注册表,就可以使用了。