Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C WinAPI获取当前麦克风输入电平?_C_Windows_Winapi_Audio - Fatal编程技术网

如何使用C WinAPI获取当前麦克风输入电平?

如何使用C WinAPI获取当前麦克风输入电平?,c,windows,winapi,audio,C,Windows,Winapi,Audio,使用Windows API,我想实现如下内容: i、 e.获取当前麦克风输入电平 我不允许使用外部音频库,但我可以使用Windows库。因此,我尝试使用waveIn函数,但我不知道如何实时处理音频输入数据 这是我目前使用的方法: 记录100毫秒 从记录的数据缓冲区中选择最高值 永远重复 但我认为这太老套了,不是推荐的方法。如何正确执行此操作?为一个非常过时但众所周知的a/V会议应用程序构建了一个调整向导,您描述的内容与我描述的内容几乎相同 一些考虑: 通过waveInAddBuffer将这些1

使用Windows API,我想实现如下内容:

i、 e.获取当前麦克风输入电平

我不允许使用外部音频库,但我可以使用Windows库。因此,我尝试使用
waveIn
函数,但我不知道如何实时处理音频输入数据

这是我目前使用的方法:

  • 记录100毫秒
  • 从记录的数据缓冲区中选择最高值
  • 永远重复

  • 但我认为这太老套了,不是推荐的方法。如何正确执行此操作?

    为一个非常过时但众所周知的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);