获取单个Windows应用程序当前音量输出级别,如在音频混音器中可视化

8
我正在尝试编写一段C#代码,输出每个访问声音输出的Windows应用程序的当前音频输出级别(如音量混合器不断变化的绿色条形图所示)。
程序将每10毫秒检查一次,并输出类似这样的结果:Windows Media Player: 30, Mozilla Firefox: 0, Adobe Flash Player: 35(如图)。
我正在使用Windows 7,并尝试在C#中实现(因为Java无法实现此功能)。
我已找到获取和设置运行应用程序的主音量(即显示Windows Media Player 65%的手柄)的方法,是否有一种方法可以获得绿色波动的级别数据呢?
谢谢!
2个回答

20
您可以使用CSCore。这里有一个CoreAudioAPI-Audiosessions的包装器,可以使用类似的东西(有关详细信息,请查看单元测试:AudioSession-UnitTests):
private static void Main(string[] args)
{
    using (var sessionManager = GetDefaultAudioSessionManager2(DataFlow.Render))
    {
        using (var sessionEnumerator = sessionManager.GetSessionEnumerator())
        {
            foreach (var session in sessionEnumerator)
            {
                using (var audioMeterInformation = session.QueryInterface<AudioMeterInformation>())
                {
                    Console.WriteLine(audioMeterInformation.GetPeakValue());
                }
            }
        }
    }

    Console.ReadKey();
}

private static AudioSessionManager2 GetDefaultAudioSessionManager2(DataFlow dataFlow)
{
    using (var enumerator = new MMDeviceEnumerator())
    {
        using (var device = enumerator.GetDefaultAudioEndpoint(dataFlow, Role.Multimedia))
        {
            Debug.WriteLine("DefaultDevice: " + device.FriendlyName);
            var sessionManager = AudioSessionManager2.FromMMDevice(device);
            return sessionManager;
        }
    }
}

要控制应用程序的音量,请查看这里的单元测试。


感谢thefiloe的回复。如问题所述,获取/设置主音量(混音器图像中滑块的最大值)已经有答案了:https://dev59.com/OWYq5IYBdhLWcg3wpyRE。我正在尝试读取混音器图像上显示的绿色值,即当前音频输出音量,它不断变化,并且始终小于等于最大主音量。 - mio
抱歉,我没有时间阅读你的整个问题。我已经编辑了我的答案。 - Florian
非常感谢,我也使用了您之前的答案 :) 因为这比连接的答案更简单易行。非常感谢。 - vanlooverenkoen

4
这是一个示例应用程序,可以在图表中显示正在运行的应用程序的音频水平。有两个版本,一个是WPF版本,另一个是Windows.Forms版本。它们使用Florian答案中的方法来获取音频水平。

https://github.com/jeske/SoundLevelMonitor

enter image description here


现在这是一个很好的例子,可以更好地理解!谢谢 - Abhinav Pandey

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