如何检查进程是否播放声音?

时间:2019-11-17 14:41:53

标签: c# cscore

我当前的代码是:

public static MMDevice GetDefaultRenderDevice()
    {
        using (var enumerator = new MMDeviceEnumerator())
        {
            return enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console);
        }
    }

    public static bool IsAudioPlaying(MMDevice device)
    {
        using (var meter = AudioMeterInformation.FromDevice(device))
        {
            return meter.PeakValue > 0;
        }
    }

当我说Console.WriteLine(IsAudioPlaying(GetDefaultRenderDevice()));时,它只会告诉您是否播放了声音。如果我只希望它检查chrome是否播放声音,该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以使用AudioSession API。 看看cscore的AudioSessionTests。 https://github.com/filoe/cscore/blob/master/CSCore.Test/CoreAudioAPI/AudioSessionTests.cs

使用以下方法可能会起作用:

using (var sessionManager = GetDefaultAudioSessionManager2(DataFlow.Render))
{
    using (var sessionEnumerator = sessionManager.GetSessionEnumerator())
    {
        foreach (var session in sessionEnumerator)
        {
            //one of the sessions is might be google chrome
            //implement your logic to select the correct session

            using (var meterInformation = session.QueryInterface<AudioMeterInformation>())
            {
                var peak = meterInformation.PeakValue;
                //implement your logic
            }
        }
    }
}

... 

private 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;
        }
    }
}