管理对麦克风输入和系统音量的访问
Posted
技术标签:
【中文标题】管理对麦克风输入和系统音量的访问【英文标题】:Managed access to microphone input and system volume 【发布时间】:2009-07-28 02:13:18 【问题描述】:我想做三件事:
从麦克风访问数据。我真的只想知道设备感应到的声音的整体音量。
设置麦克风增益。
设置系统音量。
我所有的 Windows 开发经验都是 C#/WPF,所以我想保持管理。我不需要异常高性能或实时处理或任何东西。
我环顾四周,似乎 SlimDX 可能是一个很好的包装器,但即使在那里我也不确定从哪里开始。
肯定不会那么难吧?
【问题讨论】:
【参考方案1】:这是一个链接,显示如何从 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);
【讨论】:
感谢您提供的信息丰富的回答。但是,一旦我点击“开始”按钮,该示例就会崩溃。 哪一个?第一个还是第二个? 为什么是浮点数组参数 ref ?价值还不够吗? @Dreas:我写了很多以 float[] 数组作为参数的函数。通常这些函数只是修改现有的数组,但有时它们要么修改现有的数组,要么创建一个新的更大的数组,这取决于我在做什么(混响就是一个例子)。我必须通过 ref 传递输入才能做到这一点,所以这只是一种习惯。你是对的,这个函数没有 ref 关键字也能正常工作。 函数 RootMeanSquared 是正确的,只有信号的平均值为 0,所以它上面没有 continue 分量。通常情况下是这样,但在某些情况下并非如此。【参考方案2】:不幸的是,除非您愿意忍受严重的延迟(大约 0.5 秒),否则您无法可靠地从托管代码中读取(或呈现)数据。问题是 CLR 可以一次中断您的进程 250 毫秒而不会发出警告。通常这无关紧要,但是当您尝试进行同步处理时,这可能是一个重大问题。
【讨论】:
我编写了一个 C# 应用程序,它 P/Invoked waveIn* 并实时(我认为是)渲染了一个光谱仪。它似乎没有任何如此严重的延迟问题。我只是幸运没有遇到这个问题吗? 您可能没有耗尽内存或触发 GC 循环。它还取决于您在哪个操作系统上运行。在 Vista 上,wave API 有大约 100 毫秒的延迟,这使得它们更能抵御故障。在 XP 和 Win7 上,它们以大约 30 毫秒的延迟运行,这更容易出现故障。 我正在运行 Vista。谢谢,这是个好东西。我的软件合成器不能实时运行,但我正在考虑编写一个可以实时运行的版本。考虑到我的声音生成过程已经相对昂贵,这种延迟几乎不可能实现(我假设延迟也适用于 waveOut*?)。 我认为因为您使用的是 P/Invoke 而不是托管库,所以这不是什么大问题......除非我在这种情况下弄错了,请有人纠正我。 @MahmoudAl-Qudsi 调用本身不会被延迟,因为它是非托管的,但结果的处理可能是......【参考方案3】:您可以使用 NAudio 在托管 C# 中从麦克风捕获音频。查看演示项目,了解如何执行此操作的示例。正如拉里在上面指出的那样,不要期望有很大的延迟。 NAudio 还为混音器 API 提供了托管包装器,可以让您设置麦克风音量,尽管以编程方式获取正确的控制可能很棘手。
【讨论】:
【参考方案4】:我刚刚写了一个关于如何capture sound from the microphone using SlimDX 的(非常基本的)示例代码。如果您仍在寻找答案,希望对您有所帮助。
【讨论】:
以上是关于管理对麦克风输入和系统音量的访问的主要内容,如果未能解决你的问题,请参考以下文章