管理访问麦克风输入和系统音量
我期待做三件事:管理访问麦克风输入和系统音量
从麦克风访问数据。我真正想知道的是设备感测到的声音的总音量。
设置麦克风增益。
设置系统音量。
我所有的Windows开发经验都是C#/ WPF,所以我想保持管理。我不需要特别高的性能或实时处理或任何东西。
我环顾四周,它似乎像SlimDX可能是一个很好的包装,但即使在那里,我不知道从哪里开始。
当然不是那么难吗?
以下示范如何从C#访问混音器在Windows中的链接:
http://www.codeguru.com/csharp/csharp/cs_graphics/sound/article.php/c10931
这将让您设定麦克风增益和系统卷。不过,第一部分有点复杂。基本上,你需要开始录制输入(使用DirectSound或waveInXXXX API [我个人最喜欢的])。由于每个缓冲区都充满了音频,因此您可以计算缓冲区的均方根,并使用它来估计音量。
编辑:这里是一个项目一个链接(我已经使用并修改成功,所以我知道它的工作原理)展示了如何使用waveInXXXX API录制音频:
由于我厌倦了发布链接,下面是一个计算音频缓冲区的均方根的实际公式(这里的类型是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-31 03:23:33
哪一个?第一个还是第二个? – MusiGenesis 2009-07-31 13:27:33
不幸的是,除非您愿意忍受严重的延迟(大约0.5秒),否则您无法可靠地从托管代码读取(或渲染)数据。问题是,CLR可以一次中断250毫秒的流程,而不会有任何警告。通常这并不重要,但是当您尝试进行等时处理时,它可能是一个重要问题。
您可以使用NAudio从托管C#中的麦克风捕获音频。查看演示项目,了解如何执行此操作的示例。正如拉里在上面指出的,尽管如此,不要指望有很大的延迟。 NAudio还为混音器API提供了托管包装器,可让您设置麦克风音量,但通过编程方式获得正确的控制可能会非常棘手。
当然可以。 :) – MusiGenesis 2009-07-28 02:19:13