Contrôle manuel des contrôles de transport de média système

À compter de Windows 10 version 1607, les applications UWP qui utilisent la classe MediaPlayer pour lire du contenu multimédia sont automatiquement intégrées aux contrôles de transport de média système (SMTC) par défaut. Il s’agit de la méthode recommandée d’interaction avec les contrôles de transport de média système, pour la plupart des scénarios. Pour plus d’informations sur la personnalisation de l’intégration par défaut des contrôles de transport de média système avec MediaPlayer, consultez la section Intégration avec les contrôles de transport de média système.

Certains scénarios peuvent nécessiter l’implémentation d’un contrôle manuel des contrôles de transport de média système. Il s’agit notamment d’un mediaTimelineController pour contrôler la lecture d’un ou plusieurs lecteurs multimédias. Cette implémentation est également nécessaire si vous utilisez plusieurs lecteurs multimédias et souhaitez obtenir une seule instance des contrôles de transport de média système pour votre application. Vous devez contrôler manuellement les contrôles de transport de média système si vous utilisez MediaElement pour lire du contenu multimédia.

Installer les contrôles de transport

Si vous utilisez MediaPlayer pour lire du contenu multimédia, vous pouvez obtenir une instance de la classe SystemMediaTransportControls en accédant à la propriété MediaPlayer.SystemMediaTransportControls. SI vous envisagez de contrôler manuellement les contrôles de transport de média système, vous devez désactiver l’intégration automatique fournie par MediaPlayer en définissant la propriété CommandManager.IsEnabled sur False.

Notes

Si vous désactivez l’élément MediaPlaybackCommandManager de l’instance MediaPlayer en définissant IsEnabled sur false, le lien entre MediaPlayer et TransportControls fourni par MediaPlayerElement est rompu ; autrement dit, les contrôles de transport intégrés ne contrôleront plus automatiquement la lecture du lecteur. Vous devrez donc implémenter vos propres contrôles pour pouvoir contrôler le MediaPlayer.

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

Vous pouvez également récupérer une instance de la classe SystemMediaTransportControls en appelant GetForCurrentView. Vous devez récupérer l’objet avec cette méthode si vous utilisez MediaElement pour lire du contenu multimédia.

_systemMediaTransportControls = SystemMediaTransportControls.GetForCurrentView();

Activez les boutons utilisés par votre application en définissant la propriété « is enabled » correspondante de l’objet SystemMediaTransportControls, telle que IsPlayEnabled, IsPauseEnabled, IsNextEnabled et IsPreviousEnabled. Voir la documentation de référence de SystemMediaTransportControls pour obtenir la liste complète des contrôles disponibles.

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

Inscrivez un gestionnaire pour que l’événement ButtonPressed reçoive des notifications lorsque l’utilisateur appuie sur un bouton.

_systemMediaTransportControls.ButtonPressed += SystemControls_ButtonPressed;

Gérer les pressions sur les boutons de contrôles de transport de média système

L’événement ButtonPressed est déclenché par les contrôles de transport système lorsque l’un des boutons activés est appuyé. La propriété Button de SystemMediaTransportControlsButtonPressedEventArgs passée dans le gestionnaire d’événements est membre de l’énumération SystemMediaTransportControlsButton qui indique les boutons activés qui ont été appuyés.

Pour mettre à jour des objets sur le thread d’interface utilisateur à partir du gestionnaire d’événements ButtonPressed , tel qu’un objet MediaElement , vous devez marshaler les appels via CoreDispatcher. Cela vient du fait que le gestionnaire d’événements ButtonPressed n’est pas appelé à partir du thread d’interface utilisateur. Par conséquent, une exception est générée si vous tentez de modifier directement l’interface utilisateur.

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;
    }
}

Mettre à jour les contrôles de transport de média système en tenant compte de l’état actuel du média

Vous devez informer systemMediaTransportControls lorsque l’état du média a changé afin que le système puisse mettre à jour les contrôles pour refléter l’état actuel. Pour ce faire, définissez la propriété PlaybackStatus sur la valeur MediaPlaybackStatus appropriée depuis l’événement CurrentStateChanged de la classe MediaElement, qui est déclenché dès que l’état du média change.

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;
    }
}

Mettre à jour les contrôles de transport de média système en tenant compte des informations relatives au média et des miniatures

Utilisez la classe SystemMediaTransportControlsDisplayUpdater pour mettre à jour les informations multimédias affichées par les contrôles de transport, telles que le titre de la chanson ou l’illustration de l’album pour l’élément multimédia en cours de lecture. Obtenez un instance de cette classe avec la propriété SystemMediaTransportControls.DisplayUpdater. Pour les scénarios classiques, le mode de transmission des métadonnées recommandé consiste à appeler CopyFromFileAsync en transmettant le fichier multimédia en cours de lecture. L’outil de mise à jour de l’affichage extrait automatiquement les métadonnées et l’image miniature du fichier.

Appelez la mise à jour pour que les contrôles de transport de média système mettent à jour son interface utilisateur avec les nouvelles métadonnées et miniatures.

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();
}

Si votre scénario l’exige, vous pouvez mettre à jour manuellement les métadonnées affichées par les contrôles de transport de média système en définissant les valeurs des objets MusicProperties, ImageProperties ou VideoProperties exposés par la classe 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();

Notes

Les applications doivent définir une valeur pour la propriété SystemMediaTransportControlsDisplayUpdater.Type , même si elles ne fournissent pas d’autres métadonnées multimédias à afficher par les contrôles de transport de média système. Cette valeur aide le système à gérer correctement votre contenu multimédia, notamment en empêchant l’activation de l’économiseur d’écran pendant la lecture.

Mettre à jour les propriétés de chronologie des contrôles de transport de média système

Les contrôles de transport système affichent des informations sur la chronologie de l’élément multimédia en cours de lecture, y compris la position de lecture actuelle, son heure de début et son heure de fin. Pour mettre à jour les propriétés de chronologie des contrôles de transport système, créez un nouvel objet SystemMediaTransportControlsTimelineProperties. Définissez les propriétés de l’objet afin de refléter l’état actuel de l’élément multimédia en cours de lecture. Appelez SystemMediaTransportControls.UpdateTimelineProperties pour que les contrôles mettent à jour le chronologie.

// 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);
  • Vous devez fournir une valeur pour StartTime, EndTime et Position afin que les contrôles système affichent une chronologie pour votre élément de lecture.

  • MinSeekTime et MaxSeekTime vous permettent de spécifier la plage de la chronologie dans laquelle l’utilisateur peut effectuer une recherche. Le scénario classique dans ce cas consiste à permettre aux fournisseurs de contenus d’inclure des pauses publicitaires dans leur contenu multimédia.

    Vous devez définir MinSeekTime et MaxSeekTime afin de déclencher l’événement PositionChangeRequest.

  • Il est recommandé de synchroniser les contrôles système avec la lecture multimédia en mettant à jour ces propriétés environ toutes les 5 secondes pendant la lecture et à nouveau lors de chaque changement d’état de la lecture, par exemple, lorsque cette dernière est mise en pause ou en cas de recherche d’une nouvelle position.

Répondre aux modifications des propriétés du lecteur

Il existe un ensemble de propriétés de contrôles de transport système qui se rapportent à l’état actuel du lecteur multimédia lui-même, plutôt qu’à l’état de l’élément multimédia en cours de lecture. Chacune de ces propriétés est mise en correspondance avec un événement qui est déclenché lorsque l’utilisateur ajuste le contrôle associé. Ces propriétés et événements sont les suivants :

Propriété Événement
AutoRepeatMode AutoRepeatModeChangeRequested
PlaybackRate PlaybackRateChangeRequested
ShuffleEnabled ShuffleEnabledChangeRequested

  Pour gérer l’interaction de l’utilisateur avec un de ces contrôles, commencez par enregistrer un gestionnaire pour l’événement associé.

_systemMediaTransportControls.PlaybackRateChangeRequested += SystemControls_PlaybackRateChangeRequested;

Dans le gestionnaire de cet événement, commencez par vérifier que la valeur demandée est comprise dans une plage valide et attendue. Si tel est le cas, définissez la propriété correspondante sur MediaElement , puis définissez la propriété correspondante sur l’objet 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;
    }
}
  • Afin de déclencher un de ces événements de propriété de lecteur, vous devez définir une valeur initiale pour cette propriété. Par exemple, PlaybackRateChangeRequested ne sera pas déclenché tant que vous n’aurez pas défini une valeur pour la propriété PlaybackRate au moins une fois.

Utiliser les contrôles de transport de média système pour le son en arrière-plan

Si vous n’utilisez pas l’intégration automatique des contrôles de transport de média système fournie par MediaPlayer, vous devez procéder à une intégration manuelle pour activer le son en arrière-plan. Au minimum, votre application doit activer les boutons lecture et pause en définissant IsPlayEnabled et IsPauseEnabled sur true. Votre application doit également gérer l’événement ButtonPressed . Si votre application ne satisfait pas ces exigences, la lecture audio s’arrête quand votre application est déplacée vers l’arrière-plan.

Les applications utilisant le nouveau modèle à processus unique pour l’audio d’arrière-plan doivent récupérer une instance de la classe SystemMediaTransportControls, en appelant GetForCurrentView. Les applications qui utilisent le modèle à deux processus hérité pour l’audio en arrière-plan doivent utiliser BackgroundMediaPlayer.Current.SystemMediaTransportControls pour accéder au SMTC à partir de leur processus en arrière-plan.

Pour plus d’informations sur la lecture de l’audio dans l’arrière-plan, consultez la section Contenu audio en arrière-plan.