Manuelle Steuerung der Steuerelemente für den Systemmedientransport

Ab Windows 10, Version 1607, werden UWP-Apps, welche die MediaPlayer-Klasse für die Medienwiedergabe verwenden, standardmäßig und automatisch in die Steuerelemente für den Systemmedientransport (System Media Transport Controls, SMTC) integriert. Dies ist für die meisten Szenarien die empfohlene Methode für die Interaktion mit den SMTC. Weitere Informationen zum Anpassen der standardmäßigen SMTC-Integration mit MediaPlayer finden Sie unter Integration in die Steuerelemente für den Systemmedientransport.

In verschiedenen Szenarien müssen Sie eine manuelle Steuerung der SMTC implementieren. Hierzu gehört die Verwendung einer MediaTimelineController-Klasse zum Steuern der Wiedergabe eines oder mehrerer Medienplayer. Ein anderes Szenario ist die Verwendung mehrerer Medienplayer mit nur einer Instanz der SMTC für Ihre App. Bei der Medienwiedergabe mithilfe der MediaElement-Klasse müssen Sie die SMTC manuell steuern.

Einrichten von Transportsteuerelementen

Wenn Sie für die Medienwiedergabe MediaPlayer verwenden, können Sie eine Instanz der SystemMediaTransportControls-Klasse abrufen, indem Sie auf die MediaPlayer.SystemMediaTransportControls-Eigenschaft zugreifen. Wenn Sie die SMTC manuell steuern möchten, sollten Sie die automatische Integration von MediaPlayer deaktivieren, indem Sie die CommandManager.IsEnabled-Eigenschaft auf „false“ festlegen.

Hinweis

Wenn Sie MediaPlaybackCommandManager für MediaPlayer deaktivieren, indem Sie IsEnabled auf „false“ festlegen, wird die von MediaPlayerElement bereitgestellte Verknüpfung zwischen MediaPlayer und TransportControls getrennt, sodass die integrierten Transportsteuerelemente nicht mehr automatisch die Wiedergabe des Players steuern. Stattdessen müssen Sie Ihre eigenen Steuerelemente zum Steuern des MediaPlayers implementieren.

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

Sie können auch eine Instanz der SystemMediaTransportControls-Klasse abrufen, indem Sie GetForCurrentView aufrufen. Sie müssen das Objekt mit dieser Methode abrufen, wenn Sie für die Medienwiedergabe MediaElement verwenden.

_systemMediaTransportControls = SystemMediaTransportControls.GetForCurrentView();

Legen Sie zum Aktivieren der von Ihrer App verwendeten Schaltflächen die entsprechende „IsEnabled“-Eigenschaft des SystemMediaTransportControls-Objekts fest, z. B. IsPlayEnabled, IsPauseEnabled, IsNextEnabled und IsPreviousEnabled. Eine vollständige Liste der verfügbaren Steuerelemente finden Sie in der Referenzdokumentation zu SystemMediaTransportControls.

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

Registrieren Sie einen Handler für das ButtonPressed-Ereignis, um Benachrichtigungen zu empfangen, wenn der Benutzer eine Schaltfläche betätigt.

_systemMediaTransportControls.ButtonPressed += SystemControls_ButtonPressed;

Behandeln von Klicks auf Schaltflächen von Systemmedientransport-Steuerelementen

Das ButtonPressed-Ereignis wird von den Systemsteuerelementen für den Medientransport ausgelöst, wenn eine der aktivierten Schaltflächen betätigt wird. Die an den Ereignishandler übergebene Button-Eigenschaft der SystemMediaTransportControlsButtonPressedEventArgs-Klasse ist ein Element der SystemMediaTransportControlsButton-Enumeration, die angibt, welche der aktivierten Schaltflächen betätigt wurde.

Zum Aktualisieren von Objekten im UI-Thread des ButtonPressed-Ereignishandlers (z. B. ein MediaElement-Objekt) müssen Sie die Aufrufe über den CoreDispatcher marshallen. Der Grund hierfür ist, dass der ButtonPressed-Ereignishandler nicht vom Benutzeroberflächenthread aufgerufen wird und daher eine Ausnahme ausgelöst wird, wenn Sie versuchen, die Benutzeroberfläche direkt zu ändern.

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

Aktualisieren der Steuerelemente für den Systemmedientransport mit dem aktuellen Medienstatus

Melden Sie der SystemMediaTransportControls-Klasse eine Änderung des Medienstatus, damit das System die Steuerelemente entsprechend dem aktuellen Zustand aktualisieren kann. Legen Sie dazu die PlaybackStatus-Eigenschaft auf den entsprechenden MediaPlaybackStatus-Wert innerhalb des CurrentStateChanged-Ereignisses der MediaElement-Klasse fest, die bei Änderungen des Medienstatus ausgelöst wird.

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

Aktualisieren der Steuerelemente für den Systemmedientransport mit Medieninformationen und Miniaturansichten

Verwenden Sie die SystemMediaTransportControlsDisplayUpdater-Klasse, um die von den Transportsteuerelementen angezeigten Medieninfos (z. B. den Songtitel oder das Albumbild) für das aktuell wiedergegebene Medienelement zu aktualisieren. Rufen Sie eine Instanz dieser Klasse mit der SystemMediaTransportControls.DisplayUpdater-Eigenschaft ab. Für gewöhnliche Szenarien wird empfohlen, die Metadaten mit dem Aufruf der CopyFromFileAsync-Methode und in der aktuell wiedergegebenen Mediendatei zu übergeben. Die Anzeigeaktualisierung wird die Metadaten und das Miniaturbild automatisch aus der Datei extrahieren.

Rufen Sie die Update-Methode auf, damit die Benutzeroberflächen der Steuerelemente für den Systemmedientransport mit den neuen Metadaten und der Miniaturansicht aktualisiert werden.

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

Wenn es Ihr Szenario erfordert, können Sie die von den Steuerelementen für den Systemmedientransport angezeigten Metadaten manuell aktualisieren, indem Sie die Werte der MusicProperties-, ImageProperties- oder VideoProperties-Objekte festlegen, die von der DisplayUpdater-Klasse zur Verfügung gestellt werden.


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

Hinweis

Apps sollten einen Wert für die SystemMediaTransportControlsDisplayUpdater.Type-Eigenschaft festlegen, auch wenn sie keine anderen Medienmetadaten bereitstellen, die von den System Media Transport Controls angezeigt werden sollen. Dieser Wert hilft dem System dabei, Ihre Medieninhalte ordnungsgemäß zu verarbeiten, einschließlich der Hinderung, dass der Bildschirmschoner während der Wiedergabe aktiviert wird.

Aktualisieren der Zeitskalaeigenschaften der Steuerelemente für den Systemmedientransport

Die Steuerelemente für den Systemmedientransport zeigen Informationen über die Zeitskala des aktuell wiedergegebenen Medienelements an, z. B. die aktuelle Wiedergabeposition, die Startzeit und die Endzeit des Medienelements. Erstellen Sie zum Aktualisieren der Zeitskalaeigenschaften der Steuerelemente für den Systemmedientransport ein neues SystemMediaTransportControlsTimelineProperties-Objekt. Legen Sie die Eigenschaften des Objekts so fest, dass sich der aktuelle Zustand des wiedergegebenen Medienelements widerspiegelt. Rufen Sie die SystemMediaTransportControls.UpdateTimelineProperties-Methode auf, damit die Zeitskala durch die Steuerelemente aktualisiert wird.

// 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);
  • Sie müssen einen Wert für die StartTime-, EndTime- und Position-Eigenschaften angeben, um eine Zeitskala für das wiedergegebene Element anzuzeigen.

  • Mit den MinSeekTime- und MaxSeekTime-Eigenschaften können Sie den Bereich innerhalb der Zeitskala angeben, den die Benutzer durchsuchen können. Ein typisches Szenario hierfür ist es, den Anbietern Werbepausen in ihren Medien zu ermöglichen.

    Sie müssen die MinSeekTime- und MaxSeekTime-Eigenschaften festlegen, um PositionChangeRequest auszulösen.

  • Es wird empfohlen, die Steuerelemente mit der Medienwiedergabe zu synchronisieren, indem diese Eigenschaften etwa alle fünf Sekunden während der Wiedergabe und bei Änderung des Wiedergabestatus aktualisiert werden, z. B. beim Anhalten der Wiedergabe oder bei der Suche nach einer neuen Wiedergabeposition.

Reaktion auf Änderungen der Playereigenschaften

Es gibt eine Reihe von Steuerelementeigenschaften für den Systemmedientransport, die sich auf den Zustand des Media Players selbst, und nicht auf den Zustand des wiedergegebenen Medienelements beziehen. Jede dieser Eigenschaften ist einem Ereignis zugeordnet, das ausgelöst wird, wenn der Benutzer das zugeordnete Steuerelement anpasst. Diese Eigenschaften und Ereignisse sind folgende:

Eigenschaft Ereignis
AutoRepeatMode AutoRepeatModeChangeRequested
PlaybackRate PlaybackRateChangeRequested
ShuffleEnabled ShuffleEnabledChangeRequested

  Registrieren Sie zum Behandeln von Benutzerinteraktionen mit einem der folgenden Steuerelemente zunächst einen Handler für das zugeordnete Ereignis.

_systemMediaTransportControls.PlaybackRateChangeRequested += SystemControls_PlaybackRateChangeRequested;

Stellen Sie im Handler für das Ereignis zunächst sicher, dass der angeforderte Wert innerhalb eines gültigen und erwarteten Bereichs liegt. Wenn dies der Fall ist, legen Sie die entsprechende Eigenschaft für die MediaElement-Klasse fest und anschließend die entsprechende Eigenschaft für das SystemMediaTransportControls-Objekt.

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;
    }
}
  • Sie müssen einen Anfangswert für die Eigenschaft festlegen, damit eines dieser Ereignisse der Playereigenschaft ausgelöst wird. PlaybackRateChangeRequested wird beispielsweise erst ausgelöst, wenn ein Wert für die PlaybackRate-Eigenschaft mindestens ein Mal festgelegt wurde.

Verwenden der Steuerelemente für den Systemmedientransport für Audiowiedergabe im Hintergrund

Wenn Sie die automatische SMTC-Integration von MediaPlayer nicht verwenden, müssen Sie die SMTC manuell integrieren, um Hintergrundaudio zu aktivieren. Sie sollten für Ihre App mindestens die Schaltflächen „Wiedergeben“ und „Anhalten“ aktivieren, indem Sie IsPlayEnabled und IsPauseEnabled auf „true“ festlegen. Außerdem muss die App das ButtonPressed-Ereignis behandeln. Wenn Ihre App diese Anforderungen nicht erfüllt, wird die Audiowiedergabe bei Verschieben der App in den Hintergrund beendet.

Apps, in denen das neue Einzelprozessmodell für Hintergrundaudio verwendet wird, sollten eine Instanz der SystemMediaTransportControls-Klasse abrufen, indem sie GetForCurrentView aufrufen. Apps, die das vorherige Modell mit zwei Prozessen für die Audiowiedergabe im Hintergrund verwenden, müssen BackgroundMediaPlayer.Current.SystemMediaTransportControls verwenden, um über den Hintergrundprozess Zugriff auf die SMTC zu erhalten.

Weitere Informationen zur Audiowiedergabe im Hintergrund finden Sie unter Wiedergeben von Medien im Hintergrund.