管理访问麦克风输入和系统音量

时间:2009-07-28 02:13:19

标签: .net audio microphone

我希望做三件事:

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

设置麦克风增益。

设置系统音量。

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

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

肯定不是那么难吗?

4 个答案:

答案 0 :(得分:6)

这是一个链接,显示如何从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);
}

答案 1 :(得分:4)

不幸的是,除非您愿意承受严重的延迟(大约0.5秒),否则您无法从托管代码中可靠地读取(或呈现)数据。问题是CLR可以在没有警告的情况下一次中断您的进程250毫秒。通常这没关系,但是当你尝试进行等时处理时,它可能是一个重要的问题。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

我刚刚写了一篇关于如何capture sound from the microphone using SlimDX的(非常基本的)示例代码。如果您仍在寻找答案,我希望它会有所帮助。