如何以编程方式获取当前音频水平?

12

基本上,我需要一种方法来接入当前音频输出并检查声音水平,即我需要能够检查音频设备上是否正在播放音频。

我不需要检查音量设置,而是实际播放的音频流的声音水平。

抱歉,我在询问如何在Visual Studio 2008上的Windows系统中完成此操作。

@mikerobi:这是我的推理的一部分 - 如果正在显示在系统音量计上,那么必须有一个系统调用可以将其取回。


我不理解这些负面回应,肯定有一种方法可以查看正在播放的音频是什么?我不知道从那个流中提取和使用信息是否容易,但这些评论并没有指导发帖者朝着正确的方向前进。 - Robert Massaioli
+1,既然提到了平台。从Windows Vista/7开始,我们拥有了Core Audio APIs,但我肯定从未使用过它们。让我们尝试标记为windows-api,看看我们能吸引谁。 :) - Dan J
也许你可以在这里找到一些东西 http://www.dreamincode.net/forums/topic/45693-controlling-sound-volume-in-c%23/#/ - BrunoLM
只是一个提示:您可以确定音频是否正在播放。检查音量并不是确定某些东西是否正在播放的正确方法。此外,输出流的声音级别不断变化,您想要一个尾随平均值还是正在播放的样本值? - JoshD
3个回答

2

这是一个好问题。对于32位Windows应用程序,答案是要钩入winmm.dll和其他低级音频控制DLL。在C#中,我会创建一个包含外部方法原型的包装类:

public class MyAudioWrapper
{
   [DllImport("winmm.dll", EntryPoint = "waveOutGetVolume")]
   public extern void GetWaveVolume(IntPtr devicehandle, out int Volume);

   ...
}

请查看此链接,获取Windows音频方法列表;您可以使用混音器或仅使用波形输出控制器来设置音量。您想要使用哪种方法将决定需要导入哪些库。您需要研究如何最好地定义原型,并如何获取音频/混音器设备的句柄。

1
更好的答案是在Vista及以上版本中以回路模式打开音频流并从中捕获。 - Larry Osterman

2
这是一个有用的Windows API调用链接,以下正是你要找的内容:

http://www.pinvoke.net/default.aspx/winmm.waveOutGetVolume


由于需要已更改,您不需要音频水平,我建议以下可能有所帮助:
我认为您需要阅读输出流上正在播放的内容,并通过分析一些算法中的数据,您可能能够决定是否正在播放某些内容。要做到这一点,您需要使用MMDevice API。

http://msdn.microsoft.com/en-us/library/dd316556(v=VS.85).aspx

我不想打击你的积极性,但相信我,如果你不熟悉非托管代码,这将不容易实现。

  • 每次调用都必须填写许多结构。
  • 必须按特定顺序执行调用。
  • 结构引用的封送。

即使你成功了,也无法预测设备的行为结果。祝你好运。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接