Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147432
  • 博文数量: 18
  • 博客积分: 1799
  • 博客等级: 上尉
  • 技术积分: 210
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-05 20:07
文章分类

全部博文(18)

文章存档

2015年(1)

2012年(2)

2010年(1)

2009年(1)

2008年(3)

2007年(4)

2006年(3)

2005年(3)

分类: 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目录下,然后把相关信息写入注册表,就可以使用了。

阅读(2829) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~