Поделиться через


Воспроизведение устаревших фоновых носителей

В этой статье описывается устаревшая двухпроцессная модель для добавления фоновой поддержки звука в приложение UWP. Начиная с Windows 10 версии 1607, модель с одним процессом для фонового звука, который гораздо проще реализовать. Дополнительные сведения о текущих рекомендациях по фоновому звуку см. в разделе "Воспроизведение мультимедиа" в фоновом режиме. Эта статья предназначена для поддержки приложений, уже разработанных с помощью устаревшей двухпроцессной модели.

Примечание.

Начиная с Windows версии 1703, BackgroundMediaPlayer устарел и может быть недоступен в будущих версиях Windows.

Фоновая архитектура звука

Приложение, выполняющее фоновое воспроизведение, состоит из двух процессов. Первый процесс — это основное приложение, содержащее пользовательский интерфейс приложения и логику клиента, выполняемую на переднем плане. Второй процесс — это задача фонового воспроизведения, которая реализует IBackgroundTask , как и все фоновые задачи приложения UWP. Фоновая задача содержит логику воспроизведения звука и фоновые службы. Фоновая задача взаимодействует с системой с помощью системных элементов управления транспортировкой мультимедиа.

На следующей схеме представлен обзор того, как разработана система.

Архитектура фонового звука windows 10

MediaPlayer

Пространство имен Windows.Media.Play содержит API, используемые для воспроизведения звука в фоновом режиме. Существует один экземпляр MediaPlayer для каждого приложения, с помощью которого происходит воспроизведение. Фоновое звуковое приложение вызывает методы и задает свойства класса MediaPlayer , чтобы задать текущую дорожку, начать воспроизведение, приостановить, быстро перенаправить, перемотку и т. д. Экземпляр объекта проигрывателя мультимедиа всегда доступен через свойство BackgroundMediaPlayer.Current.

Прокси-сервер MediaPlayer и заглушка

При доступе к BackgroundMediaPlayer.Current из фонового процесса приложения экземпляр MediaPlayer активируется в узле фоновой задачи и может управляться напрямую.

При доступе к BackgroundMediaPlayer.Current из приложения переднего плана экземпляр MediaPlayer, возвращаемый, фактически является прокси-сервером, который взаимодействует с заглушкой в фоновом процессе. Эта заглушка взаимодействует с фактическим экземпляром MediaPlayer , который также размещается в фоновом процессе.

Процесс переднего плана и фонового процесса может получить доступ к большинству свойств экземпляра MediaPlayer, за исключением MediaPlayer.Source и MediaPlayer.SystemMediaTransportControls, доступ к которым можно получить только из фонового процесса. Приложение переднего плана и фоновый процесс могут получать уведомления о событиях, связанных с определенными носителями, таких как MediaOpened, MediaEnded и MediaFailed.

Списки воспроизведения

Распространенный сценарий для фоновых звуковых приложений — воспроизведение нескольких элементов в строке. Это проще всего сделать в фоновом процессе с помощью объекта MediaPlaybackList, который можно задать в качестве источника в MediaPlayer, назначив его свойству MediaPlayer.Source.

Невозможно получить доступ к MediaPlaybackList из процесса переднего плана, который был задан в фоновом процессе.

Системные элементы управления транспортировкой мультимедиа

Пользователь может управлять воспроизведением звука без непосредственного использования пользовательского интерфейса приложения с помощью таких средств, как устройства Bluetooth, SmartGlass и системные элементы управления транспортировкой мультимедиа. Фоновая задача использует класс SystemMediaTransportControls для подписки на эти системные события, инициированные пользователем.

Чтобы получить экземпляр SystemMediaTransportControls из фонового процесса, используйте свойство MediaPlayer.SystemMediaTransportControls. Приложения переднего плана получают экземпляр класса путем вызова SystemMediaTransportControls.GetForCurrentView, но возвращенный экземпляр является экземпляром только переднего плана, который не связан с фоновой задачей.

Отправка сообщений между задачами

Иногда требуется взаимодействовать между двумя процессами фонового звукового приложения. Например, может потребоваться, чтобы фоновая задача уведомляла задачу переднего плана при запуске воспроизведения нового трека, а затем отправить новое название песни в задачу переднего плана для отображения на экране.

Простой механизм обмена данными вызывает события как на переднем плане, так и в фоновых процессах. Методы SendMessageToForeground и SendMessageToBackground вызывают события в соответствующем процессе. Сообщения можно получить, подписавшись на события MessageReceivedFromBackground и MessageReceivedFromForeground.

Данные можно передавать в качестве аргумента в методы отправки сообщений, которые затем передаются в обработчики событий получения сообщения. Передайте данные с помощью класса ValueSet . Этот класс представляет собой словарь, содержащий строку в виде ключа и других типов значений в качестве значений. Можно передать простые типы значений, такие как целые числа, строки и логические значения.

Жизненный цикл фоновой задачи

Время существования фоновой задачи тесно связано с текущим состоянием воспроизведения приложения. Например, когда пользователь приостанавливает воспроизведение звука, система может завершить или отменить приложение в зависимости от обстоятельств. Через некоторое время без воспроизведения звука система может автоматически завершить фоновую задачу.

Метод IBackgroundTask.Run вызывается при первом обращении приложения к backgroundMediaPlayer.Current из кода, выполняемого в приложении переднего плана, или при регистрации обработчика для события MessageReceivedFromBackground, которое происходит в первую очередь. Рекомендуется зарегистрировать для полученного сообщения обработчик перед вызовом BackgroundMediaPlayer.Current в первый раз, чтобы приложение переднего плана не пропускало сообщения, отправленные из фонового процесса.

Чтобы обеспечить работоспособность фоновой задачи, приложение должно запросить backgroundTaskDeferral из метода Run и вызвать BackgroundTaskDeferral.Complete, когда экземпляр задачи получает события Canceled или Completed. Не выполняйте цикл или подождите в методе Run , так как это использует ресурсы и может привести к прекращению фоновой задачи приложения системой.

Фоновая задача получает событие Completed , когда метод Run завершен и отсрочка не запрашивается. В некоторых случаях, когда приложение получает событие "Отмена" , за ним также может следовать событие Completed . Ваша задача может получить событие "Отмена" во время выполнения , поэтому не забудьте управлять этим потенциальным параллелизмом.

Ситуации, в которых фоновая задача может быть отменена:

  • Новое приложение с возможностями воспроизведения звука начинается в системах, которые применяют политику эксклюзивности. См. раздел " Системные политики" для времени существования фоновой звуковой задачи ниже.

  • Фоновая задача запущена, но музыка еще не играет, а затем приложение переднего плана приостановлено.

  • Другие прерывания мультимедиа, такие как входящие телефонные звонки или звонки VoIP.

Ситуации, в которых фоновая задача может быть завершена без уведомления, включают:

  • Вызов VoIP возникает и в системе недостаточно доступной памяти, чтобы сохранить фоновую задачу в живых.

  • Политика ресурсов нарушается.

  • Отмена или завершение задачи не заканчивается корректно.

Системные политики для времени существования фоновой звуковой задачи

Следующие политики помогают определить, как система управляет временем существования фоновых звуковых задач.

Исключительность

Если этот параметр включен, эта подполима ограничивает количество фоновых звуковых задач не более 1 в любое время. Она включена на мобильных устройствах и других номерах SKU, отличных от настольных компьютеров.

Время ожидания бездействия

Из-за ограничений ресурсов система может завершить фоновую задачу после периода бездействия.

Фоновая задача считается неактивной, если выполняются оба следующих условия:

  • Приложение переднего плана не отображается (оно приостановлено или завершено).

  • Фоновый проигрыватель мультимедиа не находится в состоянии воспроизведения.

Если оба из этих условий выполнены, политика фоновой системы мультимедиа начнет таймер. Если ни условие не изменилось при истечении срока действия таймера, политика фоновой системы мультимедиа завершит фоновую задачу.

Общее время существования

Если этот подполитик включен, фоновая задача будет зависеть от времени существования задачи переднего плана. Если задача переднего плана завершает работу пользователя или системы, фоновая задача также завершится.

Однако обратите внимание, что это не означает, что передний план зависит от фона. Если фоновая задача завершается, это не заставляет задачу переднего плана завершить работу.

В следующей таблице перечислены политики, в которых применяются типы устройств.

Вложенная политика Персональный компьютер Мобильные службы Другие
Исключительность Выключено Включен Включен
Время ожидания бездействия Выключено Активировано Выключено
Общее время существования Активировано Выключено Выключено