检测麦克风是不是打开
Posted
技术标签:
【中文标题】检测麦克风是不是打开【英文标题】:Detecting if the microphone is on检测麦克风是否打开 【发布时间】:2009-10-13 11:05:06 【问题描述】:有没有办法以编程方式检测麦克风是否在 Windows 上打开?
【问题讨论】:
【参考方案1】:不,麦克风不会告诉您它们是否处于“开启”状态或某个特定声道是否已连接到麦克风设备。您可以做的最好的事情是从您怀疑是麦克风的输入通道(例如 Windows 默认输入设备/通道)读取音频数据,并查看其上是否有任何信号。
为此,您必须消除任何直流偏移并寻找高于合理本底噪声的任何信号。 (慷慨一点:即使没有信号进入,许多廉价的音频输入设备也很嘈杂。中频滤波器/FFT 也可用于仅检测语音中频范围内的信号而不是低频嗡嗡声和短暂的点击。)
【讨论】:
【参考方案2】:这没有以任何方式进行测试,但我会尝试阅读一些示例,看看是否有任何变化。如果麦克风打开,那么您应该从环境声音中获得不同的值。如果麦克风关闭,您应该得到一个 0。这正是我想象的事情应该如何工作 - 我不知道他们是否真的以这种方式工作。
【讨论】:
听起来不错。我认为这就是 Skype 的做法——根据显示的消息,如果没有连接麦克风,或者由于其他原因它很安静:“你的麦克风真的很安静”【参考方案3】:由于一次愉快的事故,我可能已经发现,是的,有一种方法可以检测连接的麦克风的存在。
如果您的 Windows“录音设备”显示“没有麦克风”,那么这种方法(使用 Microsoft Speech API)将起作用并确认您没有麦克风。但是,如果 windows 认为您有麦克风,这不会不同意。
#include <sapi.h>
#include <sapiddk.h>
#include <sphelper.h>
CComPtr<ISpRecognizer> m_cpEngine;
m_cpEngine.CoCreateInstance(CLSID_SpInprocRecognizer);
CComPtr<ISpObjectToken> pAudioToken;
HRESULT hr = SpGetDefaultTokenFromCategoryId(SPCAT_AUDIOIN, &pAudioToken);
if (FAILED(hr)) ::OutputDebugString("no input, aka microphone, detected");
更具体地说,hr 会返回这个结果:
SPERR_NOT_FOUND 0x8004503a -2147200966
The requested data item (data key, value, etc.) was not found.
【讨论】:
以上是关于检测麦克风是不是打开的主要内容,如果未能解决你的问题,请参考以下文章
Android:强制外部麦克风(插孔输入 3.5mm)保持打开状态