DirectSound折腾记之一
前几日,公司的客户提出一个新要求:需要一个语音对讲软件实现语音对讲的功能。
上网搜资料,首先看到的是微软的DirectSound技术,于是从CodeProject下载一个C#编写的程序,叫VoiceChat,在此基础之上进行改写。
VoiceChat这个程序写的很不错,能实现语音对讲的基本功能,但在使用中发现有两个问题:
1、有节奏的“突突”的杂音
2、回声
再利用Google寻找答案的过程中,搜到一些有用的文章,在这里我把页面的地址也记在这里,做个备忘:
1、博客堂的“我不是圣人”的博客,该博主的源代码和VoiceChat有很多相像的地方,比如变量名等,应该是同门中人。诸位一定要看评论,我就是在评论中找到有消除杂音和回声的线索。
2、CSDN博客,文章:AEC (Acoustic Echo Canceller) 回音消除初探
http://blog.csdn.net/guanchanghui/archive/2006/08/07/1031279.aspx
是VC的代码,我没有测试过
为了实现去除回音和杂音的方法,不得已认识了CaptureEffectDescription类,也结识了CaptureEffectsClassAcousticEchoCancellation和CaptureEffectsMsAcousticEchoCancellation两位朋友,蛮以为大功告成,谁知道还缺一个关键的FullDuplex对象,然而在实例化FullDuplex的时候,缺总是抛出异常。
想找个使用FullDuplex类的例子,听说微软的DirectX SDK中有,于是下载了Microsoft DirectX SDK (March 2009),安装以后才发现没有FullDuplex的例子,于是又下载了一个早一些的版本,仍然找不到,最后终于在Microsoft DirectX SDK sum2004里找到,在找资料的过程中,发现网上有很多VC的源代码和例子,于是改变主意,从网上下载一个名叫“多人语音聊天”的VC源代码,就为了编译它,我几乎花了整个下午的时间:
1、源代码中用到的头文件streams.h,Microsoft DirectX SDK sum2004以后的版本都没有,要安装Microsoft DirectX SDK sum2004
2、需要静态库strmbasd.lib,微软在SDK中竟然没有提供,还需要打开BaseClasses项目编译生成,我的系统上装有VC6和VC2008,我先用VC2008编译,设置了一些编译选项,勉强编译通过,可在编译“多人语音聊天”项目时,碰到很多莫名其妙的问题,最后以失败而告终。
3、接下来使用VC6编译BaseClasses和“多人语音聊天”这两个项目,又是一番折腾,最后终于在下面这篇文章的指导下通过了编译(还不得已注释了两行代码)
文章地址:http://blog.csdn.net/schoolers/archive/2009/04/27/4128785.aspx,不过运行时还是碰到了问题,可能是我注释的代码造成的。
最后不得不放弃使用VC的想法,重新拾起VoiceChat。