偵測及回應音訊狀態變更
從 Windows 10 版本 1803 開始,您的應用程式可以偵測系統何時降低或靜音應用程式所使用的音訊串流音訊層級。 您可以接收有關擷取和轉譯串流、特定音訊裝置和音訊類別或應用程式用於媒體播放的 MediaPlayer 物件的通知。 例如,當警示響起時,系統可能會降低或「躲避」音訊播放層級。 如果您的應用程式未在應用程式清單中宣告 backgroundMediaPlayback 功能,系統將在您的應用程式進入背景時將其靜音。
處理音訊狀態變更的模式在所有支援的音訊串流中都相同。 首先,建立 AudioStateMonitor 類別的執行個體。 在下列範例中,應用程式使用 MediaCapture 類別來擷取遊戲聊天的音訊。 呼叫 Factory 方法,以取得與預設通訊裝置的遊戲聊天音訊擷取串流相關聯的音訊狀態監視器。 接下來,系統會為 SoundLevelChanged 事件註冊處理常式,當系統變更相關聯串流的音訊層級時,將會引發此事件。
AudioStateMonitor gameChatAudioStateMonitor;
string deviceId = Windows.Media.Devices.MediaDevice.GetDefaultAudioCaptureId(Windows.Media.Devices.AudioDeviceRole.Communications);
gameChatAudioStateMonitor = AudioStateMonitor.CreateForCaptureMonitoringWithCategoryAndDeviceId(MediaCategory.GameChat, deviceId);
gameChatAudioStateMonitor.SoundLevelChanged += GameChatSoundLevelChanged;
在 SoundLevelChanged 事件處理常式中,檢查入處理常式的 AudioStateMonitor 傳送者的 SoundLevel 屬性,以決定串流的新音訊層級。 在此範例中,應用程式在聲音等級靜音時停止擷取音訊,並在聲音等級恢復到最大音量時恢復擷取。
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;
}
}
有關使用 MediaCapture 擷取音訊的更多資訊,請參閱使用 MediaCapture 進行基本相片、視訊和音訊擷取。
MediaPlayer 類別的每個執行個體都有一個與之關聯的 AudioStateMonitor,您可以使用它來偵測系統何時變更目前正在播放的內容的音量等級。 您可以決定根據正在播放的內容類型,以不同的方式處理音訊狀態變更。 例如,您可能會決定在音訊降低時暫停播放播客,但如果內容是音樂,您可以繼續播放。
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;
}
}
}
有關使用 MediaPlayer 的更多資訊,請參閱使用 MediaPlayer 播放音訊和視訊。