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

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

问题描述:

我期待做三件事:管理访问麦克风输入和系统音量

从麦克风访问数据。我真正想知道的是设备感测到的声音的总音量。

设置麦克风增益。

设置系统音量。

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

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

当然不是那么难吗?

+1

当然可以。 :) – MusiGenesis 2009-07-28 02:19:13

以下示范如何从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

由于我厌倦了发布链接,下面是一个计算音频缓冲区的均方根的实际公式(这里的类型是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); 
} 
+0

感谢您提供丰富的答案。但是,只要我点击“开始”按钮,该示例就会崩溃。 – 2009-07-31 03:23:33

+0

哪一个?第一个还是第二个? – MusiGenesis 2009-07-31 13:27:33

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

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

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