【问题标题】:How to programmatically get the current audio level?如何以编程方式获取当前音频电平?
【发布时间】:2011-04-28 21:54:38
【问题描述】:

基本上,我需要的是一种利用当前音频输出并检查声音级别的方法,即我需要能够检查音频设备上是否正在播放某些东西。

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

抱歉,我问的是如何在 Windows 中的 Visual Studio 2008 上进行操作。

@mikerobi:这构成了我推理的一部分——如果它显示在系统音量计上,则必须有一个系统调用可以将其取回

【问题讨论】:

  • 我不明白负面反应,肯定有办法查看正在播放的音频吗?我不知道从该流中提取和有用的信息是否容易,但这些 cmets 并没有将海报指向正确的方向。
  • +1,现在提到了平台。从 Windows Vista/7 开始,我们有 Core Audio APIs,但我肯定从未使用过它们。让我们尝试标记这个windows-api,看看我们画了谁。 :)
  • 也许你可以在这里找到一些东西dreamincode.net/forums/topic/…
  • 请注意:您可以确定是否正在播放音频。检查音量不是确定是否正在播放的正确方法。此外,输出流的声级不断变化,您想要一个尾随平均值还是当时正在播放的样本的值?

标签: c# c++ windows winapi


【解决方案1】:

这是一个有用的 Windows API 调用链接,这正是您正在寻找的:

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


由于要求发生了变化并且您不需要音频级别,我建议以下可能会有所帮助:

我认为您需要读取输出流上正在播放的内容,并通过分析某些算法中的数据,您可能能够确定是否正在播放某些内容。为此,您需要 MMDevice API

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

我不想让您失望,但请相信我,如果您不熟悉非托管代码,这将不会很容易实现。

  • 您必须在每次调用中填写许多结构。
  • 您必须按特定顺序执行调用。
  • 编组对结构的引用。

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

【讨论】:

    【解决方案2】:

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

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

    查看this link 以获取 Windows 音频方法列表;您可以使用混音器或仅使用波形输出控制器来设置音量。您要使用的内容将决定要导入的库。您必须研究如何最好地定义原型,以及如何获得音频/混音器设备的句柄。

    【讨论】:

    • 对于 Vista 及更高版本,更好的答案是在环回模式下打开音频流并从中捕获。
    【解决方案3】:

    我最近在这里回答了这样一个问题,请参阅How to detect if any sound plays on a Windows machine

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 2011-03-16
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多