Ручное управление системными элементами управления воспроизведением мультимедиа

Начиная c Windows 10 версии 1607, приложения UWP, использующие класс MediaPlayer для воспроизведения мультимедиа, по умолчанию автоматически интегрируются с системными элементами управления транспортировкой мультимедиа (SMTC). Это рекомендуемый способ взаимодействия с SMTC для большинства сценариев. Дополнительные сведения о настройке интеграции SMTC с MediaPlayer по умолчанию см. в разделе Интеграция с системными элементами управления транспортировкой мультимедиа.

Несколько ситуаций, в которых может потребоваться реализовать ручной элемент управления SMTC. К ним относятся те, в которых MediaTimelineController используется для управления воспроизведением одного или нескольких проигрывателей мультимедиа. Если вы используете несколько проигрывателей мультимедиа и хотите иметь только один экземпляр SMTC для вашего приложения. Необходимо вручную управлять SMTC, если вы используете MediaElement для воспроизведения мультимедиа.

Настройка элементов управления транспортом

Если вы используете MediaPlayer для воспроизведения мультимедиа, вы можете получить экземпляр класса SystemMediaTransportControls путем получения доступа к свойству MediaPlayer.SystemMediaTransportControls. Если вы собираетесь вручную управлять SMTC, отключите автоматическую интеграцию, обеспечиваемую MediaPlayer, задав свойству CommandManager.IsEnabled значение false.

Примечание

Если вы отключите MediaPlaybackCommandManager в объекте MediaPlayer, установив для свойства IsEnabled значение false, это нарушит связь между свойством TransportControls объекта MediaPlayer, предоставляемым классом MediaPlayerElement, поэтому встроенные элементы управления транспортом больше не будут автоматически управлять воспроизведением мультимедиа. Вместо этого вам нужно будет реализовать собственные элементы управления для управления воспроизведением MediaPlayer.

_mediaPlayer = new MediaPlayer();
_systemMediaTransportControls = _mediaPlayer.SystemMediaTransportControls;
_mediaPlayer.CommandManager.IsEnabled = false;

Также можно получить экземпляр класса SystemMediaTransportControls, вызвав метод GetForCurrentView. Необходимо получить объект с помощью этого метода, если вы используете MediaElement для воспроизведения мультимедиа.

_systemMediaTransportControls = SystemMediaTransportControls.GetForCurrentView();

Включите кнопки, которые будут использоваться приложением, настроив соответствующее свойство "is enabled" объекта SystemMediaTransportControls, например IsPlayEnabled, IsPauseEnabled, IsNextEnabled и IsPreviousEnabled. Полный список доступных элементов управления см. в справочной документации для SystemMediaTransportControls.

_systemMediaTransportControls.IsPlayEnabled = true;
_systemMediaTransportControls.IsPauseEnabled = true;

Зарегистрируйте обработчик события ButtonPressed, чтобы получать уведомления, когда пользователь нажимает кнопку.

_systemMediaTransportControls.ButtonPressed += SystemControls_ButtonPressed;

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

При нажатии одной из включенных кнопок системные элементы управления транспортом создают событие ButtonPressed. Свойство Button объекта SystemMediaTransportControlsButtonPressedEventArgs, переданное в обработчик события, является участником SystemMediaTransportControlsButton перечисления, которое указывает, какие из включенных кнопок нажаты.

Чтобы можно было из обработчика событий ButtonPressed обновлять объекты в потоке пользовательского интерфейса, например объект MediaElement, необходимо маршалировать вызовы через объект CoreDispatcher. Это необходимо, из-за того что обработчик событий ButtonPressed не вызывается из потока пользовательского интерфейса. Поэтому при попытке непосредственного изменения пользовательского интерфейса возникнет исключение.

async void SystemControls_ButtonPressed(SystemMediaTransportControls sender,
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                mediaElement.Play();
            });
            break;
        case SystemMediaTransportControlsButton.Pause:
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                mediaElement.Pause();
            });
            break;
        default:
            break;
    }
}

Обновление системных элементов управления транспортом мультимедиа с помощью сведений о текущем состоянии мультимедиа

При изменении состояния мультимедиа необходимо уведомлять об этом класс SystemMediaTransportControls, чтобы система могла обновить элементы управления согласно текущему состоянию. Чтобы сделать это, задайте для свойства PlaybackStatus соответствующее значение MediaPlaybackStatus из события CurrentStateChanged объекта MediaElement, возникшего при изменении состояния мультимедиа.

void MediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (mediaElement.CurrentState)
    {
        case MediaElementState.Playing:
            _systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            _systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            _systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            _systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}

Обновление системных элементов управления транспортом мультимедиа с помощью эскизов и сведений о мультимедиа

С помощью класса SystemMediaTransportControlsDisplayUpdater можно обновить сведения о мультимедиа, отображаемые элементами управления транспортом, например название композиции или обложку альбома для воспроизводимого элемента мультимедиа. Получите экземпляр этого класса с помощью свойства SystemMediaTransportControls.DisplayUpdater. Для обычных сценариев рекомендуем способ передачи метаданных, который заключается в вызове метода CopyFromFileAsync и передачи в него воспроизводящегося файла мультимедиа. Модуль обновления отображения автоматически извлечет метаданные и изображение эскиза из файла.

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

async void MediaElement_MediaOpened(object sender, RoutedEventArgs e)
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = _systemMediaTransportControls.DisplayUpdater;

    await updater.CopyFromFileAsync(MediaPlaybackType.Music, currentMediaFile);

    // Update the system media transport controls
    updater.Update();
}

Если это необходимо для вашего сценария, можно вручную обновить метаданные, отображаемые системными элементами управления транспортом, настроив значения свойств MusicProperties, ImageProperties или VideoProperties, предоставленных классом DisplayUpdater.


// Get the updater.
SystemMediaTransportControlsDisplayUpdater updater = _systemMediaTransportControls.DisplayUpdater;

// Music metadata.
updater.Type = MediaPlaybackType.Music;
updater.MusicProperties.Artist = "artist";
updater.MusicProperties.AlbumArtist = "album artist";
updater.MusicProperties.Title = "song title";

// Set the album art thumbnail.
// RandomAccessStreamReference is defined in Windows.Storage.Streams
updater.Thumbnail =
   RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Music/music1_AlbumArt.jpg"));

// Update the system media transport controls.
updater.Update();

Примечание

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

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

Системные элементы управления транспортом отображают информацию о временной шкале для воспроизводимого элемента мультимедиа, включая текущую позицию воспроизведения, время начала и время окончания элемента мультимедиа. Чтобы обновить свойства временной шкалы системных элементов управления транспортом, создайте объект SystemMediaTransportControlsTimelineProperties. Настройте свойства объекта, чтобы отразить текущее состояние воспроизводящегося элемента мультимедиа. Вызовите метод SystemMediaTransportControls.UpdateTimelineProperties, чтобы заставить элементы управления обновить временную шкалу.

// Create our timeline properties object 
var timelineProperties = new SystemMediaTransportControlsTimelineProperties();

// Fill in the data, using the media elements properties 
timelineProperties.StartTime = TimeSpan.FromSeconds(0);
timelineProperties.MinSeekTime = TimeSpan.FromSeconds(0);
timelineProperties.Position = mediaElement.Position;
timelineProperties.MaxSeekTime = mediaElement.NaturalDuration.TimeSpan;
timelineProperties.EndTime = mediaElement.NaturalDuration.TimeSpan;

// Update the System Media transport Controls 
_systemMediaTransportControls.UpdateTimelineProperties(timelineProperties);
  • Необходимо указать значение для свойств StartTime, EndTime и Position, чтобы системные элементы управления отображали временную шкалу для воспроизводящегося элемента.

  • С помощью свойств MinSeekTime и MaxSeekTime можно указать диапазон в пределах временной шкалы, в котором пользователь может выполнять поиск. Для этого можно использовать типичный сценарий, заключающийся в том, чтобы разрешить поставщикам содержимого включать рекламные паузы в их мультимедиа.

    Необходимо настроить свойства MinSeekTime и MaxSeekTime, чтобы можно было создать событие PositionChangeRequest.

  • Рекомендуется синхронизировать системные элементы управления с процессом воспроизведения мультимедиа. Для этого во время воспроизведения необходимо обновлять эти свойства приблизительно каждые 5 секунд, а также при изменении состояния воспроизведения, например при приостановке или при поиске новой позиции.

Реакция на изменение свойств проигрывателя

Существует набор свойств системных элементов управления транспортом, относящихся к текущему состоянию мультимедиапроигрывателя, а не к состоянию воспроизводимого элемента мультимедиа. Каждое из этих свойств сопоставлено событию, которое создается, когда пользователь изменяет связанный элемент управления. Эти свойства и события перечислены ниже.

Свойство Событие
AutoRepeatMode AutoRepeatModeChangeRequested
PlaybackRate PlaybackRateChangeRequested
ShuffleEnabled ShuffleEnabledChangeRequested

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

_systemMediaTransportControls.PlaybackRateChangeRequested += SystemControls_PlaybackRateChangeRequested;

Прежде всего убедитесь, что в обработчике события необходимое значение находится в допустимом и ожидаемом диапазоне. Если это так, настройте соответствующее свойство объекта MediaElement, а затем — соответствующее свойство объекта SystemMediaTransportControls.

void SystemControls_PlaybackRateChangeRequested(SystemMediaTransportControls sender, PlaybackRateChangeRequestedEventArgs args)
{
    // Check the requested value to make sure it is within a valid and expected range
    if (args.RequestedPlaybackRate >= 0 && args.RequestedPlaybackRate <= 2)
    {
        // Set the requested value on the MediaElement
        mediaElement.PlaybackRate = args.RequestedPlaybackRate;

        // Update the system media controls to reflect the new value
        _systemMediaTransportControls.PlaybackRate = mediaElement.PlaybackRate;
    }
}
  • Чтобы возникло одно из этих событий свойств проигрывателя, необходимо настроить начальное значение для свойства. Например, событие PlaybackRateChangeRequested не будет создано до тех пор, пока вы хотя бы один раз не присвоите значение свойству PlaybackRate.

Использование системных элементов управления транспортом мультимедиа для воспроизведения звука в фоновом режиме

Если вы не используете автоматическую интеграцию SMTC, обеспечиваемую MediaPlayer, необходимо вручную провести интеграцию с SMTC для включения звука в фоновом режиме. Как минимум, ваше приложение должно включить кнопки воспроизведения и приостановки, задав свойствам IsPlayEnabled и IsPauseEnabled значение true. Кроме того, ваше приложение должно обрабатывать событие ButtonPressed. Если ваше приложение не соответствует этим требованиям, воспроизведение звука будет прекращаться при переходе приложения в фоновый режим.

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

Дополнительные сведения о воспроизведении звука в фоновом режиме см. в разделе Воспроизведение мультимедиа в фоновом режиме.