如何使用C WinAPI获取当前麦克风输入电平?
使用Windows API,我想实现如下内容: i、 e.获取当前麦克风输入电平 我不允许使用外部音频库,但我可以使用Windows库。因此,我尝试使用如何使用C WinAPI获取当前麦克风输入电平?,c,windows,winapi,audio,C,Windows,Winapi,Audio,使用Windows API,我想实现如下内容: i、 e.获取当前麦克风输入电平 我不允许使用外部音频库,但我可以使用Windows库。因此,我尝试使用waveIn函数,但我不知道如何实时处理音频输入数据 这是我目前使用的方法: 记录100毫秒 从记录的数据缓冲区中选择最高值 永远重复 但我认为这太老套了,不是推荐的方法。如何正确执行此操作?为一个非常过时但众所周知的a/V会议应用程序构建了一个调整向导,您描述的内容与我描述的内容几乎相同 一些考虑: 通过waveInAddBuffer将这些1
waveIn
函数,但我不知道如何实时处理音频输入数据
这是我目前使用的方法:
但我认为这太老套了,不是推荐的方法。如何正确执行此操作?为一个非常过时但众所周知的a/V会议应用程序构建了一个调整向导,您描述的内容与我描述的内容几乎相同 一些考虑: 通过waveInAddBuffer将这些100ms缓冲区中的5到10个排队到音频设备中。IIRC,当waveIn队列变空时,奇怪的事情就会发生。然后,当waveInProc回调发生时,按照您的描述,在完成的缓冲区中搜索具有最高绝对值的样本。然后将其绘制到您的可视化中。重新计算已完成的缓冲区 很明显,可以将示例值线性映射到可视化上,如下所示 例如,绘制16位样本
// convert sample magnitude from 0..32768 to 0..N
length = (sample * N) / 32768;
DrawLine(length);
但是,当你对着麦克风说话时,这种形象就不会显得“活跃”或“生机勃勃”
但更好的方法是给那些能量较低的样品增加强度。实现这一点的简单方法是沿着μ-定律曲线重新绘制(或使用表格查找)
您可以将上述方法调整到任何看起来不错的方法。您可以依赖Windows中的值,而不是自己计算值。这实际上是Windows设置屏幕截图中显示的值 有关
IAudioMeterInformation
接口,请参见以下示例:.
它是为播放而制作的,但您也可以将其用于捕获 一些备注,如果您打开麦克风的
IAudioMeterInformation
,但没有应用程序打开来自此麦克风的流,则音量将为0。这意味着,当您想要显示麦克风峰值计时,您需要打开一个麦克风流,就像您已经打开的一样。
另外,请阅读有关
IAudioMeterInformation
的文档,它可能不是您所需要的,因为它是峰值。这取决于你想用它做什么 检查和确认一下怎么样
length = (sample * N) / 32768;
length = log(1+length)/log(N);
length = max(length,N)
DrawLine(length);