Partager via


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 les médias sont automatiquement intégrées aux contrôles de transport multimédia système (SMTC) par défaut. Il s’agit du moyen recommandé d’interagir avec le SMTC pour la plupart des scénarios. Pour plus d’informations sur la personnalisation de l’intégration par défaut de SMTC à MediaPlayer, consultez Intégrer avec les contrôles de transport multimédia système.

Il existe quelques scénarios où vous devrez peut-être implémenter un contrôle manuel du SMTC. Celles-ci incluent si vous utilisez un MediaTimelineController pour contrôler la lecture d’un ou plusieurs lecteurs multimédias. Ou si vous utilisez plusieurs lecteurs multimédias et que vous ne souhaitez avoir qu’une seule instance de SMTC pour votre application. Vous devez contrôler manuellement le SMTC si vous utilisez MediaElement pour lire le média.

Configurer des contrôles de transport

Si vous utilisez MediaPlayer pour lire des médias, vous pouvez obtenir une instance de la classe SystemMediaTransportControls en accédant à la propriété MediaPlayer.SystemMediaTransportControls. Si vous allez contrôler manuellement le SMTC, vous devez désactiver l’intégration automatique fournie par MediaPlayer en définissant la propriété CommandManager.IsEnabled sur false.

Remarque

Si vous désactivez MediaPlaybackCommandManager du MediaPlayer en définissant IsEnabled sur false, il interrompt le lien entre MediaPlayer les TransportControls fournis par MediaPlayerElement, de sorte que les contrôles de transport intégrés ne contrôlent plus automatiquement la lecture du lecteur. Au lieu de cela, vous devez implémenter vos propres contrôles pour contrôler MediaPlayer.

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

Vous pouvez également obtenir une instance de SystemMediaTransportControls en appelant GetForCurrentView. Vous devez obtenir l’objet avec cette méthode si vous utilisez MediaElement pour lire le média.

_systemMediaTransportControls = SystemMediaTransportControls.GetForCurrentView();

Activez les boutons que votre application utilisera en définissant la propriété « is enabled » correspondante de l’objet SystemMediaTransportControls, tel que IsPlayEnabled, IsPauseEnabled, IsNextEnabled et IsPreviousEnabled. Consultez 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 l’événement ButtonPressed pour recevoir des notifications lorsque l’utilisateur appuie sur un bouton.

_systemMediaTransportControls.ButtonPressed += SystemControls_ButtonPressed;

Gérer les touches des contrôles de transport multimé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 quels boutons activés 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 est dû au fait que le gestionnaire d’événements ButtonPressed n’est pas appelé à partir du thread d’interface utilisateur et qu’une exception est levée si vous tentez de modifier l’interface utilisateur directement.

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 multimédia système avec l’état actuel du média

Vous devez notifier 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 à partir de l’événement CurrentStateChanged du MediaElement, déclenché lorsque 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 multimédia système avec des informations multimédias et des miniatures

Utilisez la classe SystemMediaTransportControlsDisplayUpdater pour mettre à jour les informations multimédias affichées par les contrôles de transport, tels que le titre de la chanson ou l’art de l’album pour l’élément multimédia en cours de lecture. Obtenez une instance de cette classe avec la propriété SystemMediaTransportControls.DisplayUpdater. Pour les scénarios classiques, la méthode recommandée pour passer les métadonnées consiste à appeler CopyFromFileAsync, en passant le fichier multimédia en cours de lecture. Le générateur de mise à jour d’affichage extrait automatiquement les métadonnées et l’image miniature du fichier.

Appelez la mise à jour pour que les contrôles de transport multimé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 les métadonnées affichées manuellement par les contrôles de transport multimé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();

Remarque

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 le contenu multimédia, notamment empêcher l’enregistrement d’écran de s’activer pendant la lecture.

Mettre à jour les propriétés de chronologie des contrôles de transport multimé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, l’heure de début et l’heure de fin de l’élément multimédia. Pour mettre à jour les propriétés de chronologie des contrôles de transport système, créez un objet SystemMediaTransportControlsTimelineProperties. Définissez les propriétés de l’objet pour refléter l’état actuel de l’élément multimédia en lecture. Appelez SystemMediaTransportControls.UpdateTimelineProperties pour que les contrôles mettent à jour la 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 l’élément 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 dans la chronologie que l’utilisateur peut rechercher. Un scénario classique est de permettre aux fournisseurs de contenu d’inclure des coupures de publicité dans leur média.

    Vous devez définir MinSeekTime et MaxSeekTime pour que positionChangeRequest soit déclenché.

  • Nous vous recommandons de maintenir les contrôles système synchronisés avec votre lecture multimédia en mettant à jour ces propriétés environ toutes les 5 secondes pendant la lecture et à nouveau chaque fois que l’état de la lecture change, comme la suspension ou la recherche d’une nouvelle position.

Répondre aux modifications apportées aux propriétés du lecteur

Il existe un ensemble de propriétés de contrôle de transport système qui concernent l’état actuel du lecteur multimédia lui-même, plutôt que l’état de l’élément multimédia de lecture. Chacune de ces propriétés est mise en correspondance avec un événement 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 utilisateur avec l’un de ces contrôles, inscrivez d’abord un gestionnaire pour l’événement associé.

_systemMediaTransportControls.PlaybackRateChangeRequested += SystemControls_PlaybackRateChangeRequested;

Dans le gestionnaire de l’événement, vérifiez d’abord que la valeur demandée se trouve 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;
    }
}
  • Pour que l’un de ces événements de propriété de lecteur soit déclenché, vous devez définir une valeur initiale pour la propriété. Par exemple, PlaybackRateChangeRequested ne sera déclenché qu’après avoir défini une valeur pour la propriété PlaybackRate au moins une fois.

Utiliser les contrôles de transport multimédia système pour l’audio en arrière-plan

Si vous n’utilisez pas l’intégration automatique smTC fournie par MediaPlayer , vous devez l’intégrer manuellement au SMTC pour activer l’audio en arrière-plan. Au minimum, votre application doit activer les boutons de lecture et de pause en définissant IsPlayEnabled et IsPauseEnabled sur true. Votre application doit également gérer l’événement ButtonPressed . Si votre application ne répond pas à ces exigences, la lecture audio s’arrête lorsque votre application passe à l’arrière-plan.

Les applications qui utilisent le nouveau modèle à processus unique pour l’audio en arrière-plan doivent obtenir une instance de 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 en arrière-plan, consultez Lire le média en arrière-plan.