Erkennen von und Reagieren auf Audio-Zustandsänderungen

Ab Windows 10 Version 1803 kann Ihre App erkennen, wenn das System die Audioebene eines von Ihrer App verwendeten Audiostreams herunter- oder stummschaltet. Sie können Benachrichtigungen für Aufnahme- und Renderdatenströme, für ein bestimmtes Audiogerät und eine bestimmte Audiokategorie oder für ein MediaPlayer-Objekt erhalten, das Ihre App für die Medienwiedergabe verwendet. Beispielsweise kann das System den Audiowiedergabepegel verringern oder "enten" lassen, wenn ein Alarm klingelt. Das System schaltet Ihre App stumm, wenn sie in den Hintergrund wechselt, wenn Ihre App nicht die backgroundMediaPlayback-Funktion im App-Manifest deklariert hat.

Das Muster für die Behandlung von Audiozustandsänderungen ist für alle unterstützten Audiostreams identisch. Erstellen Sie zunächst eine instance der AudioStateMonitor-Klasse. Im folgenden Beispiel verwendet die App die MediaCapture-Klasse , um Audiodaten für Den Spielchat zu erfassen. Eine Factorymethode wird aufgerufen, um einen Audiozustandsmonitor abzurufen, der dem Audioaufnahmestream des Spielchats des Standardkommunikationsgeräts zugeordnet ist. Als Nächstes wird ein Handler für das SoundLevelChanged-Ereignis registriert, das ausgelöst wird, wenn die Audioebene für den zugeordneten Stream vom System geändert wird.

AudioStateMonitor gameChatAudioStateMonitor;
string deviceId = Windows.Media.Devices.MediaDevice.GetDefaultAudioCaptureId(Windows.Media.Devices.AudioDeviceRole.Communications);
gameChatAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoringWithCategoryAndDeviceId(MediaCategory.GameChat, deviceId);
gameChatAudioStateMonitor.SoundLevelChanged += GameChatSoundLevelChanged;

Überprüfen Sie im SoundLevelChanged-Ereignishandler die SoundLevel-Eigenschaft des An den Handler übergebenen AudioStateMonitor-Absenders , um zu bestimmen, wie die neue Audioebene für den Stream ist. In diesem Beispiel beendet die App die Audioaufnahme, wenn der Soundpegel stumm geschaltet ist, und setzt die Aufzeichnung fort, wenn die Audioebene wieder die volle Lautstärke erreicht.

private void GameChatSoundLevelChanged(AudioStateMonitor sender, object args)
{
    switch (sender.SoundLevel)
    {
        case SoundLevel.Full:
            StartAudioCapture();
            break;
        case SoundLevel.Muted:
            StopAudioCapture();
            break;
        case SoundLevel.Low:
            // Audio capture should never be "ducked", only muted or full volume.
            Debug.WriteLine("Unexpected audio state change.");
            break;
    }
}

Weitere Informationen zum Aufzeichnen von Audio mit MediaCapture finden Sie unter Grundlegende Foto-, Video- und Audioaufnahme mit MediaCapture.

Jedem instance der MediaPlayer-Klasse ist ein AudioStateMonitor zugeordnet, mit dem Sie erkennen können, wann das System die Lautstärke des aktuell wiedergegebenen Inhalts ändert. Je nachdem, welche Art von Inhalt wiedergegeben wird, können Sie sich entscheiden, Audiozustandsänderungen unterschiedlich zu behandeln. Beispielsweise können Sie sich entscheiden, die Wiedergabe eines Podcasts anzuhalten, wenn die Audiowiedergabe verringert wird, aber die Wiedergabe fortsetzen, wenn der Inhalt Musik ist.

bool isPodcast;
bool isPausedDueToAudioStateMonitor;
private void AudioStateMonitor_SoundLevelChanged(Windows.Media.Audio.AudioStateMonitor sender, object args)
{
    if ((sender.SoundLevel == SoundLevel.Full) || (sender.SoundLevel == SoundLevel.Low && !isPodcast))
    {
        if (isPausedDueToAudioStateMonitor)
        {
            mediaPlayer.Play();
            isPausedDueToAudioStateMonitor = false;
        }
    }
    else if ((sender.SoundLevel == SoundLevel.Muted) ||
         (sender.SoundLevel == SoundLevel.Low && isPodcast))
    {
        if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
        {
            mediaPlayer.Pause();
            isPausedDueToAudioStateMonitor = true;
        }
    }

}

Weitere Informationen zur Verwendung des MediaPlayer finden Sie unter Wiedergeben von Audio- und Videoinhalten mit MediaPlayer.