VISTA或WIN7下使用立体声混音作为录音来源时,如何通过编程方式去除或加入麦克风的输入
2012-09-24 15:12
381 查看
在编制一个录制会议的程序时遇到一些问题。该程序有这样的需求,通过程序可以控制录制过程中是否录制远端通过网络传输过来的声音(Speaker)、录制方本地麦克风的声音(Microphone)以及两者全录(ALL)或全不录(NONE)。最初的思路是MIC的录制使用waveIn系列API,写一个回调函数将MIC的输入写入AVI中,同时SPEAKER的录制使用API钩子函数实现,即改写waveOut系列中需要用到的那几个API,链接入系统的钩子函数链,这样一进一出均可录制,另外分别设置一个布尔变量来控制录与不录、录哪个的组合(Speaker、Microphone、ALL、NONE)。但在实现后发觉,要么全有(ALL)、要么全无(NONE),深入调试后发现:waveOut的钩子函数根本没起作用,录制全在waveIn的回调函数里了,而且即使禁用麦克风而仅仅使用立体声混音作为录制的默认设备,也能录到麦克风的声音(这个的确很让人感到不寻常)。但是,播放->扬声器->级别
页面上的麦克风禁音却是个总开关!!!如果这里关了,录制里无论禁不禁麦克风,都不会有麦克风的声音;但这里开了,录制里无论禁不禁麦克风,都会有麦克风的声音!!!这就解释了要么全录、要么全未录的原因所在。考虑到APIHOOK使用的是比较老版的Jeffray的类库(第4版),于是换用最新第5版的(2008年发布),结果却出现堆栈溢出的情况,分析发现其新的类库用在全局钩子时没有这个问题,在局部钩子中会出现此问题。因此其中一个解决方案是改写程序,增加一个动态链接库而不是目前的仅一个EXE文件。另外一个方案是通过程序来控制WINDOWS系统的声音控制,如果人工操作非常简单,就是开或禁:播放->扬声器->级别
页面上的麦克风,这看似简单至极的方案用程序来实现却一点不简单。搜遍了VS2005关于声音及多媒体的所有SDK文档,均找不到相关的控制这个的办法。后来在网上搜,得知VISTA之前微软是没有开放这些低层音频接口的,VISTA之后微软通过COM提供给开发者这些控制功能,但即使如此,也是很晦涩的,这些接口的使用已经很靠近驱动层了。
要用到的头文件有:
#include <mmdeviceapi.h>
#include <devicetopology.h>
要用到的API:
MMDevice API
DeviceTopology API
通过遍历SPEAKER里所有的PART,找到MICROPHONE节点,判断其是否有MUTE这个PART,如果有就对其进行操作从而控制输出中MIC的输出,如果禁掉这里的MIC,就录制不到MIC,打开则可以录制。(未完待续)
页面上的麦克风禁音却是个总开关!!!如果这里关了,录制里无论禁不禁麦克风,都不会有麦克风的声音;但这里开了,录制里无论禁不禁麦克风,都会有麦克风的声音!!!这就解释了要么全录、要么全未录的原因所在。考虑到APIHOOK使用的是比较老版的Jeffray的类库(第4版),于是换用最新第5版的(2008年发布),结果却出现堆栈溢出的情况,分析发现其新的类库用在全局钩子时没有这个问题,在局部钩子中会出现此问题。因此其中一个解决方案是改写程序,增加一个动态链接库而不是目前的仅一个EXE文件。另外一个方案是通过程序来控制WINDOWS系统的声音控制,如果人工操作非常简单,就是开或禁:播放->扬声器->级别
页面上的麦克风,这看似简单至极的方案用程序来实现却一点不简单。搜遍了VS2005关于声音及多媒体的所有SDK文档,均找不到相关的控制这个的办法。后来在网上搜,得知VISTA之前微软是没有开放这些低层音频接口的,VISTA之后微软通过COM提供给开发者这些控制功能,但即使如此,也是很晦涩的,这些接口的使用已经很靠近驱动层了。
要用到的头文件有:
#include <mmdeviceapi.h>
#include <devicetopology.h>
要用到的API:
MMDevice API
DeviceTopology API
通过遍历SPEAKER里所有的PART,找到MICROPHONE节点,判断其是否有MUTE这个PART,如果有就对其进行操作从而控制输出中MIC的输出,如果禁掉这里的MIC,就录制不到MIC,打开则可以录制。(未完待续)
相关文章推荐
- VISTA或WIN7下使用立体声混音作为录音来源时,如何通过编程方式去除或加入麦克风的输入
- VISTA或WIN7下使用立体声混音作为录音来源时,如何通过编程方式去除或加入麦克风的输入
- 如何去除Win7快捷方式小箭头
- java如何从cmd运行并使用text文件作为输入源的总结
- Win7、Vista下如何正确删除快捷方式箭头图标
- 使用 IBM Rational Software Architect 通过编程方式生成 UML 模型
- 编程技巧:使用LINQ如何通过多次调用GroupBy实现分组嵌套
- 如何优雅的使用WIN7——不常用快捷方式
- Win7通过注册表打开立体声混音选项
- 如何通过编程方式将SharePoint中的Infopath表单及附件进行归档
- 如何使用WebBrowser控件打印格式化的XML文档,并以编程方式任意设置打印方向(C#完整示例)
- (转)在C#中使用WIA获取扫描仪数据(四、通过编程方式扫描图像)
- 解决Win7下使用waveIn系列函数录音时插拔麦克风时的死锁问题
- 使用eclipse时弹出框要求输入用户名和密码,如何去除
- 通过编程的方式控制程序的内存使用量
- 开发者是如何提升技能水平的 发表于1小时前| 770次阅读| 来源SquareSpace| 1 条评论| 作者Denis Gobo 开源程序员博客代码编程经验分享 摘要:作为一个技术开发人员,不断的学
- 如何在WCF解决方案中使用WCS(windows cardspace)作为身份验证方式
- 如何在Vista中使用MMC方式的Remote Desktops(How to use Remote Desktops through mmc console in Vista)
- 如何通过编程方式获取alexa排名的数据
- android端和pc端使用usb进行socket通信,其中android是服务器端,pc是客户端。如何实现安卓端输入的数据通过按钮发送到pc端?