检测系统的音频级别更改并做出响应

了解如何检测和响应系统的音频级别更改。 从 Windows 10 版本 1803 开始,你的应用可以检测系统何时降低或静音应用的音频捕获和音频呈现流的音频级别。 例如,应用进入后台状态时,系统可能将应用的流设为静音。

若要了解如何使用 MediaCapture 类捕获音频,请参阅 使用 MediaCapture捕获基本照片、视频和音频。 有关使用 MediaPlayer 的音频播放的信息,请参阅 TBD。

AudioStateMonitor 类可用于注册以接收系统修改音频捕获或呈现流的音量时出现的事件。 通过调用 CreateForCaptureMonitoring来获取 AudioStateMonitor 实例,以监控音频捕获流。 通过调用 CreateForRenderMonitoring获取监视音频呈现流的实例。 针对系统更改相应流类别的音频时要通知的每个监视器的 SoundLevelChanged 事件,注册一个处理程序。

AudioStateMonitor captureAudioStateMonitor;
AudioStateMonitor renderAudioStateMonitor;
captureAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoring();
captureAudioStateMonitor.SoundLevelChanged += CaptureAudioStateMonitor_SoundLevelChanged;

renderAudioStateMonitor = AudioStateMonitor.CreateForRenderMonitoring();
renderAudioStateMonitor.SoundLevelChanged += RenderAudioStateMonitor_SoundLevelChanged;

在捕获流的 SoundLevelChanged 处理程序中,可查看 AudioStateMonitor 发件人的 SoundLevel 属性来确定新的音量。 请注意:系统决不可让捕获流的音量降低或忽高忽低。 系统仅可将其静音或切换回最大音量。 如果音频流已静音,则可以停止正在进行的捕获。 如果音频流还原到完整音量,可以再次开始捕获。

bool isCapturingAudio = false;
bool capturingStoppedForAudioState = false;

private void CaptureAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    switch (sender.SoundLevel)
    {
        case SoundLevel.Full:
            if (capturingStoppedForAudioState)
            {
                MyStartAudioCapture();
                capturingStoppedForAudioState = false;
            }
            break;
        case SoundLevel.Muted:
            if (isCapturingAudio)
            {
                MyStopAudioCapture();
                capturingStoppedForAudioState = true;
            }
            break;
        case SoundLevel.Low:
            // This should never happen for capture
            Debug.WriteLine("Unexpected audio state.");
            break;
    }
}

下面的代码示例演示用于音频渲染的 SoundLevelChanged 处理程序的实现。 根据你的应用场景和你正在播放的内容类型,你可能希望在声音级别被降低时暂停音频播放。

bool contentIsPodcast; 
private void RenderAudioStateMonitor_SoundLevelChanged(AudioStateMonitor sender, object args)
{
    if ((sender.SoundLevel == SoundLevel.Full) ||
        (sender.SoundLevel == SoundLevel.Low && !contentIsPodcast))
    {
        m_mediaPlayer.Play();
    }
    else if ((sender.SoundLevel == SoundLevel.Muted) ||
         (sender.SoundLevel == SoundLevel.Low && contentIsPodcast))
    {
        // Pause playback if we�re muted or if we�re playing a podcast and are ducked
        m_mediaPlayer.Pause();
    }
}

使用 MediaCapture 进行基本的照片、视频和音频捕获