gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:11:13 25 4
gpt4 key购买 nike

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

mic test example

即获取当前麦克风输入电平。

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

这是我目前正在使用的方法:

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

但我认为这太老套了,不是推荐的方法。我怎样才能正确地做到这一点?

最佳答案

为一个非常过时但众所周知的 A/V session 应用程序构建了一个调整向导,您所描述的内容与我所做的几乎相同。

一些注意事项:

通过waveInAddBuffer 将 5 到 10 个 100ms 缓冲区放入音频设备中。 IIRC,当waveIn队列变空时,奇怪的事情就会发生。然后,当发生 waveInProc 回调时,按照您的描述在已完成的缓冲区中搜索具有最高绝对值的样本。然后将其绘制到您的可视化中。对已完成的缓冲区重新排队。

将样本值按如下方式线性映射到可视化效果似乎是显而易见的。

例如,绘制 16 位样本

// convert sample magnitude from 0..32768 to 0..N
length = (sample * N) / 32768;
DrawLine(length);

但是当你对着麦克风说话时,这种可视化就不会显得“活跃”或“充满活力”。

但更好的方法是为那些较低能量的样本提供更多的强度。简单的方法是沿着 μ 律曲线重新绘制(或使用查表)。

length =  (sample * N) / 32768;
length = log(1+length)/log(N);
length = max(length,N)
DrawLine(length);

您可以将上述方法调整为任何看起来不错的方法。

关于c - 如何使用 C WinAPI 获取当前麦克风输入电平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58668176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com