瞭解如何偵測和回應系統的音訊電平變更。 從 Windows 10 版本 1803 開始,你的應用程式可以偵測系統何時降低或靜音應用程式的音訊擷取和音訊渲染串流音量。 例如,系統可能會在你的應用程式進入背景時靜音串流。
想了解如何使用 MediaCapture 課程捕捉音訊,請參閱 Basic 照片、影片與 MediaCapture 音訊擷取。 關於使用 MediaPlayer 播放音訊的資訊,請參見 使用 MediaPlayer 播放音訊與影片。
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();
}
}