5

我想做三件事:

从麦克风访问数据。我真的只想知道设备感应到的声音的整体音量。

设置麦克风增益。

设置系统音量。

我所有的 Windows 开发经验都是 C#/WPF,所以我想保持管理。我不需要异常高性能或实时处理或任何东西。

我环顾四周,似乎 SlimDX 可能是一个很好的包装器,但即使在那里我也不知道从哪里开始。

肯定不会那么难吧?

4

4 回答 4

7

这是一个链接,显示了如何从 C# 访问 Windows 中的音频混音器:

http://www.codeguru.com/csharp/csharp/cs_graphics/sound/article.php/c10931

这将让您设置麦克风增益和系统音量。不过,第一部分稍微复杂一些。基本上,您需要开始录制输入(使用 DirectSound 或 waveInXXXX API [我个人最喜欢的])。随着每个缓冲区充满音频,您可以计算缓冲区的均方根并使用它来估计音量。

编辑:这是一个项目的链接(我已经成功使用和修改,所以我知道它有效),它显示了如何使用 waveInXXXX API 录制音频:

http://www.codeproject.com/KB/audio-video/cswavrec.aspx?df=90&fid=16677&mpp=25&noise=3&sort=Position&view=Quick&select=3005817

编辑2:因为我厌倦了发布链接,这里有一个计算音频缓冲区的均方根的实际公式(这里的类型是float [],但可以很容易地修改它来处理short [],即你通常会从 waveInXXXX 得到什么):

public static float RootMeanSquared(ref float[] audio)
{
    double sumOfSquared = 0;
    for (int i = 0; i < audio.Length; i++)
    {
        sumOfSquared += audio[i] * audio[i];
    }
    return (float)Math.Sqrt(sumOfSquared / (double)audio.Length);
}
于 2009-07-28T02:24:20.587 回答
4

不幸的是,除非您愿意忍受严重的延迟(大约 0.5 秒),否则您无法可靠地从托管代码中读取(或呈现)数据。问题是 CLR 可以一次中断您的进程 250 毫秒而不会发出警告。通常这无关紧要,但是当您尝试进行同步处理时,这可能是一个重大问题。

于 2009-07-29T05:49:18.290 回答
3

您可以使用NAudio从托管 C# 中的麦克风捕获音频。查看演示项目,了解如何执行此操作的示例。正如拉里在上面指出的那样,不要期望有很大的延迟。NAudio 还管理了混音器 API 的包装器,可以让您设置麦克风音量,尽管以编程方式获取正确的控制可能很棘手。

于 2009-08-03T11:11:37.383 回答
1

我刚刚写了一个(非常基本的)示例代码,说明如何使用 SlimDX 从麦克风捕获声音。如果您仍在寻找答案,我希望它会有所帮助。

于 2009-08-06T17:17:31.213 回答