Обнаружение изменения состояния звука и реагирование на него
Начиная с Windows 10 версии 1803 ваше приложение может определять, когда система снижает или отключает уровень звукового потока, который использует ваше приложение. Вы можете получать уведомления для захвата и воспроизведения потоков для определенного звукового устройства и категории аудио или для объекта MediaPlayer, который ваше приложение использует для воспроизведения мультимедиа. Например, система может снизить уровень звука, если включается будильник. Система отключает звук приложения, когда оно переходит в фоновый режим, если приложение не объявило возможность backgroundMediaPlayback в манифесте приложения.
Шаблон обработки изменения состояния звука одинаков для всех поддерживаемых звуковых потоков. Сначала создайте экземпляр класса AudioStateMonitor. В следующем примере приложение использует класс MediaCapture для записи звука для игрового чата. Фабричный метод вызывается для получения монитора состояния звука, связанного с потоком аудиозаписи игрового чата устройства связи по умолчанию. Затем регистрируется обработчик события 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 проверка свойство SoundLevel отправителя AudioStateMonitor, переданное в обработчик, чтобы определить новый уровень звука для потока. В этом примере приложение перестает записывать аудио, если звук отключен, и возобновляет запись, когда восстанавливается полная громкость звука.
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.
Связанные темы
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по