Adaptives StreamingAdaptive streaming

In diesem Artikel wird beschrieben, wie Sie die Wiedergabe von Multimediainhalten für adaptives Streaming einer App für die Universelle Windows-Plattform (UWP) hinzufügen können.This article describes how to add playback of adaptive streaming multimedia content to a Universal Windows Platform (UWP) app. Diese Funktion unterstützt die Wiedergabe von http Live Streaming (HLS) und Dynamic Streaming over HTTP (Dash)-Inhalt.This feature supports playback of Http Live Streaming (HLS) and Dynamic Streaming over HTTP (DASH) content. Ab Windows 10, Version 1803, wird Smooth Streaming von adaptivemediasource unterstützt.Starting with Windows 10, version 1803, Smooth Streaming is supported by AdaptiveMediaSource.

Eine Liste mit unterstützten HLS-Protokolltags finden Sie unter Unterstützung von HLS-Tags.For a list of supported HLS protocol tags, see HLS tag support.

Eine Liste der unterstützten Dash-Profile finden Sie unter Dash-Profil Unterstützung.For a list of supported DASH profiles, see DASH profile support.

Hinweis

Der Code in diesem Artikel wurde aus dem Beispiel für adaptives Streaming für UWP übernommen und angepasst.The code in this article was adapted from the UWP Adaptive streaming sample.

Einfaches adaptives Streaming mit MediaPlayer und MediaPlayerElementSimple adaptive streaming with MediaPlayer and MediaPlayerElement

Erstellen Sie ein Uri-Objekt, das auf eine DASH- oder HLS-Manifestdatei verweist, um Medien für adaptives Streaming in einer UWP-App wiederzugeben.To play adaptive streaming media in a UWP app, create a Uri object pointing to a DASH or HLS manifest file. Erstellen Sie eine Instanz der MediaPlayer-Klasse.Create an instance of the MediaPlayer class. Rufen Sie MediaSource.CreateFromUri auf, um ein neues MediaSource-Objekt zu erstellen, und legen Sie es dann auf die Source-Eigenschaft von MediaPlayer fest.Call MediaSource.CreateFromUri to create a new MediaSource object and then set that to the Source property of the MediaPlayer. Rufen Sie Play auf, um die Wiedergabe des Medieninhalts zu starten.Call Play to start playback of the media content.

MediaPlayer _mediaPlayer;
System.Uri manifestUri = new Uri("http://amssamples.streaming.mediaservices.windows.net/49b57c87-f5f3-48b3-ba22-c55cfdffa9cb/Sintel.ism/manifest(format=m3u8-aapl)");
_mediaPlayer = new MediaPlayer();
_mediaPlayer.Source = MediaSource.CreateFromUri(manifestUri);
_mediaPlayer.Play();

Im obigen Beispiel werden die Audiodaten des Medieninhalts wiedergegeben, aber der Inhalt wird nicht automatisch auf Ihrer Benutzeroberfläche gerendert.The above example will play the audio of the media content but it doesn't automatically render the content in your UI. Für die meisten Apps, mit denen Videoinhalte wiedergegeben werden, wird der Inhalt auf einer XAML-Seite gerendert.Most apps that play video content will want to render the content in a XAML page. Fügen Sie der XAML-Seite hierzu ein MediaPlayerElement-Steuerelement hinzu.To do this, add a MediaPlayerElement control to your XAML page.

<MediaPlayerElement x:Name="mediaPlayerElement" HorizontalAlignment="Stretch" AreTransportControlsEnabled="True"/>

Rufen Sie MediaSource.CreateFromUri auf, um ein MediaSource-Element über den URI einer DASH- oder HLS-Manifestdatei zu erstellen.Call MediaSource.CreateFromUri to create a MediaSource from the URI of a DASH or HLS manifest file. Legen Sie anschließend die Source-Eigenschaft von MediaPlayerElement fest.Then set the Source property of the MediaPlayerElement. MediaPlayerElement erstellt automatisch eine neues MediaPlayer-Objekt für den Inhalt.The MediaPlayerElement will automatically create a new MediaPlayer object for the content. Sie können Play für das MediaPlayer-Objekt aufrufen, um die Wiedergabe des Inhalts zu starten.You can call Play on the MediaPlayer to start playback of the content.

System.Uri manifestUri = new Uri("http://amssamples.streaming.mediaservices.windows.net/49b57c87-f5f3-48b3-ba22-c55cfdffa9cb/Sintel.ism/manifest(format=m3u8-aapl)");
mediaPlayerElement.Source = MediaSource.CreateFromUri(manifestUri);
mediaPlayerElement.MediaPlayer.Play();

Hinweis

Ab Windows 10, Version 1607, wird die Verwendung der MediaPlayer-Klasse zum Wiedergeben von Medienelementen empfohlen.Starting with Windows 10, version 1607, it is recommended that you use the MediaPlayer class to play media items. MediaPlayerElement ist ein einfaches XAML-Steuerelement, das zum Rendern des Inhalts eines MediaPlayer-Objekts auf einer XAML-Seite verwendet wird.The MediaPlayerElement is a lightweight XAML control that is used to render the content of a MediaPlayer in a XAML page. Das MediaElement-Steuerelement wird aus Gründen der Abwärtskompatibilität weiterhin unterstützt.The MediaElement control continues to be supported for backwards compatibility. Weitere Informationen zur Verwendung von MediaPlayer und MediaPlayerElement zum Wiedergeben von Medieninhalten finden Sie unter Wiedergeben von Audio- und Videoinhalten mit „MediaPlayer“.For more information about using MediaPlayer and MediaPlayerElement to play media content, see Play audio and video with MediaPlayer. Informationen zur Verwendung von MediaSource und dazugehörigen APIs für die Arbeit mit Medieninhalten finden Sie unter Medienelemente, Wiedergabelisten und Titel.For information about using MediaSource and related APIs to work with media content, see Media items, playlists, and tracks.

Adaptives Streaming mit AdaptiveMediaSourceAdaptive streaming with AdaptiveMediaSource

Verwenden Sie das AdaptiveMediaSource-Objekt, wenn Ihre App erweiterte adaptive Streamingfunktionen erfordert, z. B. das Bereitstellen von benutzerdefinierten HTTP-Headern, die Überwachung der aktuellen Download- und Wiedergabe-Bitraten oder das Anpassen der Verhältnisse, die bestimmen, wann das System Bitraten des adaptiven Datenstroms wechselt.If your app requires more advanced adaptive streaming features, such as providing custom HTTP headers, monitoring the current download and playback bitrates, or adjusting the ratios that determine when the system switches bitrates of the adaptive stream, use the AdaptiveMediaSource object.

Die adaptiven Streaming-APIs sind im Windows.Media.Streaming.Adaptive-Namespace zu finden.The adaptive streaming APIs are found in the Windows.Media.Streaming.Adaptive namespace. In den Beispielen in diesem Artikel werden APIs aus den folgenden Namespaces verwendet.The examples in this article use APIs from the following namespaces.

using Windows.Media.Streaming.Adaptive;
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.Media.Playback;
using Windows.Media.Core;

Initialisieren Sie eine adaptivemediasource aus einem URI.Initialize an AdaptiveMediaSource from a URI.

Initialisieren Sie AdaptiveMediaSource mit dem URI einer adaptiven Streaming-Manifestdatei durch Aufrufen von CreateFromUriAsync.Initialize the AdaptiveMediaSource with the URI of an adaptive streaming manifest file by calling CreateFromUriAsync. Der von dieser Methode zurückgegebene AdaptiveMediaSourceCreationStatus-Wert teilt Ihnen mit, ob die Medienquelle erfolgreich erstellt wurde.The AdaptiveMediaSourceCreationStatus value returned from this method lets you know if the media source was created successfully. Wenn dies der Fall ist, können Sie das Objekt als Streamquelle für Media Player festlegen, indem Sie ein MediaSource -Objekt durch Aufrufen von MediaSource. createfromadaptivemediasourceerstellen und es dann der Source -Eigenschaft von Media Player zuweisen.If so, you can set the object as the stream source for your MediaPlayer by creating a MediaSource object by calling MediaSource.CreateFromAdaptiveMediaSource, and then assigning it to the media player's Source property. In diesem Beispiel wird die AvailableBitrates-Eigenschaft abgefragt, um die maximal unterstützte Bitrate für diesen Datenstrom zu ermitteln. Anschließend wird dieser Wert als ursprüngliche Bitrate festgelegt.In this example, the AvailableBitrates property is queried to determine the maximum supported bitrate for this stream, and then that value is set as the inital bitrate. In diesem Beispiel werden auch Handler für die verschiedenen adaptivemediasource -Ereignisse registriert, die später in diesem Artikel erläutert werden.This example also registers handlers for the several AdaptiveMediaSource events that are discussed later in this article.

async private void InitializeAdaptiveMediaSource(System.Uri uri)
{
    AdaptiveMediaSourceCreationResult result = await AdaptiveMediaSource.CreateFromUriAsync(uri);

    if (result.Status == AdaptiveMediaSourceCreationStatus.Success)
    {
        ams = result.MediaSource;
        mediaPlayerElement.SetMediaPlayer(new MediaPlayer());
        mediaPlayerElement.MediaPlayer.Source = MediaSource.CreateFromAdaptiveMediaSource(ams);
        mediaPlayerElement.MediaPlayer.Play();


        ams.InitialBitrate = ams.AvailableBitrates.Max<uint>();

        //Register for download requests
        ams.DownloadRequested += DownloadRequested;

        //Register for download failure and completion events
        ams.DownloadCompleted += DownloadCompleted;
        ams.DownloadFailed += DownloadFailed;

        //Register for bitrate change events
        ams.DownloadBitrateChanged += DownloadBitrateChanged;
        ams.PlaybackBitrateChanged += PlaybackBitrateChanged;

        //Register for diagnostic event
        ams.Diagnostics.DiagnosticAvailable += DiagnosticAvailable;
    }
    else
    {
        // Handle failure to create the adaptive media source
        MyLogMessageFunction($"Adaptive source creation failed: {uri} - {result.ExtendedError}");
    }
}

Initialisieren einer adaptivemediasource mithilfe von httpclientInitialize an AdaptiveMediaSource using HttpClient

Wenn Sie benutzerdefinierte HTTP-Header für das Abrufen der Manifestdatei festlegen müssen, können Sie ein HttpClient-Objekt erstellen, die gewünschten Header festlegen und das Objekt an die Überladung von CreateFromUriAsync übergeben.If you need to set custom HTTP headers for getting the manifest file, you can create an HttpClient object, set the desired headers, and then pass the object into the overload of CreateFromUriAsync.

httpClient = new Windows.Web.Http.HttpClient();
httpClient.DefaultRequestHeaders.TryAppendWithoutValidation("X-CustomHeader", "This is a custom header");
AdaptiveMediaSourceCreationResult result = await AdaptiveMediaSource.CreateFromUriAsync(manifestUri, httpClient);

Das DownloadRequested-Ereignis wird ausgelöst, wenn das System eine Ressource vom Server abruft.The DownloadRequested event is raised when the system is about to retrieve a resource from the server. Die an den Ereignishandler übergebene AdaptiveMediaSourceDownloadRequestedEventArgs macht Eigenschaften verfügbar, die Informationen über die angeforderte Ressource wie Typ und URI der Ressource bereitstellen.The AdaptiveMediaSourceDownloadRequestedEventArgs passed into the event handler exposes properties that provide information about the resource being requested such as the type and URI of the resource.

Ändern der Eigenschaften von Ressourcenanforderungen mithilfe des downloadangeforderten EreignissesModify resource request properties using the DownloadRequested event

Sie können mit dem DownloadRequested-Ereignishandler die Ressourcenanforderung durch Aktualisieren der Eigenschaften des von den Ereignisargumenten bereitgestellten AdaptiveMediaSourceDownloadResult-Objekts ändern.You can use the DownloadRequested event handler to modify the resource request by updating the properties of the AdaptiveMediaSourceDownloadResult object provided by the event args. Im folgenden Beispiel wird der URI, aus dem die Ressource abgerufen wird, durch die Aktualisierung der ResourceUri-Eigenschaften des Ergebnisobjekts geändert.In the example below, the URI from which the resource will be retrieved is modified by updating the ResourceUri properties of the result object. Sie können auch den Byte Bereichs Offset und die Länge für Medien Segmente neu schreiben oder, wie im folgenden Beispiel gezeigt, den Ressourcen-URI ändern, um die vollständige Ressource herunterzuladen und den Byte Bereichs Offset und die Länge auf NULL festzulegen.You can also rewrite the byte range offset and length for media segments or, as shown the example below, change the resource URI to download the full resource and set the byte range offset and length to null.

Sie können den Inhalt der angeforderten Ressource durch Festlegen der Buffer- oder InputStream-Eigenschaften des Ergebnisobjekts überschreiben.You can override the content of the requested resource by setting the Buffer or InputStream properties of the result object. Im folgenden Beispiel wird der Inhalt der Manifestressource durch Festlegen der Buffer-Eigenschaft ersetzt.In the example below, the contents of the manifest resource are replaced by setting the Buffer property. Wenn Sie die Ressourcenanforderung mit Daten aktualisieren, die asynchron abgerufen werden, z. B. durch Abrufen von Daten von einem Remoteserver oder asynchrone Benutzerauthentifizierung, müssen Sie AdaptiveMediaSourceDownloadRequestedEventArgs.GetDeferral aufrufen, um eine Verzögerung abzurufen. Anschließend bei Abschluss des Vorgangs rufen Sie dann Complete auf, um dem System zu signalisieren, dass der Downloadanforderungsvorgang fortgesetzt werden kann.Note that if you are updating the resource request with data that is obtained asynchronously, such as retrieving data from a remote server or asynchronous user authentication, you must call AdaptiveMediaSourceDownloadRequestedEventArgs.GetDeferral to get a deferral and then call Complete when the operation is complete to signal the system that the download request operation can continue.

    private async void DownloadRequested(AdaptiveMediaSource sender, AdaptiveMediaSourceDownloadRequestedEventArgs args)
    {

        // rewrite key URIs to replace http:// with https://
        if (args.ResourceType == AdaptiveMediaSourceResourceType.Key)
        {
            string originalUri = args.ResourceUri.ToString();
            string secureUri = originalUri.Replace("http:", "https:");

            // override the URI by setting property on the result sub object
            args.Result.ResourceUri = new Uri(secureUri);
        }

        if (args.ResourceType == AdaptiveMediaSourceResourceType.Manifest)
        {
            AdaptiveMediaSourceDownloadRequestedDeferral deferral = args.GetDeferral();
            args.Result.Buffer = await CreateMyCustomManifest(args.ResourceUri);
            deferral.Complete();
        }

        if (args.ResourceType == AdaptiveMediaSourceResourceType.MediaSegment)
        {
            var resourceUri = args.ResourceUri.ToString() + "?range=" + 
                args.ResourceByteRangeOffset + "-" + (args.ResourceByteRangeLength - 1);

            // override the URI by setting a property on the result sub object
            args.Result.ResourceUri = new Uri(resourceUri);

            // clear the byte range properties on the result sub object
            args.Result.ResourceByteRangeOffset = null;
            args.Result.ResourceByteRangeLength = null;
        }
    }

Verwenden von Bitrate-Ereignissen zum Verwalten und reagieren auf Bitrate-ÄnderungenUse bitrate events to manage and respond to bitrate changes

Das AdaptiveMediaSource-Objekt stellt Ereignisse bereit, mit denen Sie reagieren können, wenn sich die Download- oder Wiedergabe-Bitraten ändern.The AdaptiveMediaSource object provides events that allow you to react when the download or playback bitrates change. In diesem Beispiel werden die aktuellen Bitraten einfach auf der Benutzeroberfläche aktualisiert.In this example, the current bitrates are simply updated in the UI. Sie können die Verhältnisse ändern, die bestimmen, wann das System Bitraten des adaptiven Datenstroms wechselt.Note that you can modify the ratios that determine when the system switches bitrates of the adaptive stream. Weitere Informationen finden Sie unter der AdvancedSettings-Eigenschaft.For more information, see the AdvancedSettings property.

private async void DownloadBitrateChanged(AdaptiveMediaSource sender, AdaptiveMediaSourceDownloadBitrateChangedEventArgs args)
{
    await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
    {
        txtDownloadBitrate.Text = args.NewValue.ToString();
    }));
}

private async void PlaybackBitrateChanged(AdaptiveMediaSource sender, AdaptiveMediaSourcePlaybackBitrateChangedEventArgs args)
{
    await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
    {
        txtPlaybackBitrate.Text = args.NewValue.ToString();
    }));
}

Behandeln von Download Vervollständigungs-und FehlerereignissenHandle download completion and failure events

Das adaptivemediasource -Objekt löst das DownloadFailed -Ereignis aus, wenn das Herunterladen einer angeforderten Ressource fehlschlägt.The AdaptiveMediaSource object raises the DownloadFailed event when the download of a requested resource fails. Sie können dieses Ereignis verwenden, um die Benutzeroberfläche als Reaktion auf den Fehler zu aktualisieren.You can use this event to update your UI in response to the failure. Sie können auch das-Ereignis verwenden, um statistische Informationen über den Downloadvorgang und den Fehler zu protokollieren.You can also use the event to log statistical information about the download operation and the failure.

Das an den Ereignishandler übergebenen adaptivemediasourcedownloadfailedeventargs -Objekt enthält Metadaten über den Fehler beim Herunterladen der Ressource, z. b. den Ressourcentyp, den URI der Ressource und die Position innerhalb des Streams, in der der Fehler aufgetreten ist.The AdaptiveMediaSourceDownloadFailedEventArgs object passed into the event handler contains metadata about the failed resource download, such as the resource type, the URI of the resource, and the position within the stream where the failure occurred. Die RequestId erhält einen vom System generierten eindeutigen Bezeichner für die Anforderung, der zum Korrelieren von Statusinformationen zu einer einzelnen Anforderung über mehrere Ereignisse verwendet werden kann.The RequestId gets a system-generated unique identifier for the request that can be use to correlate status information about an individual request across multiple events.

Die Statistics -Eigenschaft gibt ein adaptivemediasourcedownloadstatistics -Objekt zurück, das ausführliche Informationen über die Anzahl der zum Zeitpunkt des Ereignisses empfangenen Bytes und die zeitliche Steuerung der verschiedenen Meilensteine im Downloadvorgang bereitstellt.The Statistics property returns a AdaptiveMediaSourceDownloadStatistics object which provides detailed information about the number of bytes received at the time of the event and the timing of various milestones in the download operation. Sie können diese Informationen protokollieren, um Leistungs-Probleme in ihrer adaptiven streamingimplementierung zu identifizieren.You can log this information in order identify perfomance issues in your adaptive streaming implementation.

private void DownloadFailed(AdaptiveMediaSource sender, AdaptiveMediaSourceDownloadFailedEventArgs args)
{
    var statistics = args.Statistics;

    MyLogMessageFunction("download failed for: " + args.ResourceType + 
     " - " + args.ResourceUri +
     " – Error:" + args.ExtendedError.HResult +
     " - RequestId" + args.RequestId + 
     " – Position:" + args.Position +
     " - Duration:" + args.ResourceDuration +
     " - ContentType:" + args.ResourceContentType +
     " - TimeToHeadersReceived:" + statistics.TimeToHeadersReceived + 
     " - TimeToFirstByteReceived:" + statistics.TimeToFirstByteReceived + 
     " - TimeToLastByteReceived:" + statistics.TimeToLastByteReceived +
     " - ContentBytesReceivedCount:" + statistics.ContentBytesReceivedCount);

}

Das downloadabgeschlossene -Ereignis tritt auf, wenn ein Ressourcen Download abgeschlossen ist, und es werden ähnliche Daten an das DownloadFailed -Ereignis ausgegeben.The DownloadCompleted event occurs when a resource download completes and provdes similar data to the DownloadFailed event. Erneut wird ein RequestId- Element für das korrelieren von Ereignissen für eine einzelne Anforderung bereitgestellt.Once again, a RequestId is provided for correlating events for a single request. Außerdem wird ein adaptivemediasourcedownloadstatistics -Objekt bereitgestellt, um die Protokollierung von Download Statistiken zu aktivieren.Also, an AdaptiveMediaSourceDownloadStatistics object is provided to enable logging of download stats.

private void DownloadCompleted(AdaptiveMediaSource sender, AdaptiveMediaSourceDownloadCompletedEventArgs args)
{
    var statistics = args.Statistics;

    MyLogMessageFunction("download completed for: " + args.ResourceType + " - " +
     args.ResourceUri +
     " – RequestId:" + args.RequestId +
     " – Position:" + args.Position +
     " - Duration:" + args.ResourceDuration +
     " - ContentType:" + args.ResourceContentType +
     " - TimeToHeadersReceived:" + statistics.TimeToHeadersReceived + 
     " - TimeToFirstByteReceived:" + statistics.TimeToFirstByteReceived + 
     " - TimeToLastByteReceived:" + statistics.TimeToLastByteReceived +
     " - ContentBytesReceivedCount:" + statistics.ContentBytesReceivedCount);

}

Sammeln von adaptiven streamingtelemetriedaten mit adaptivemediasourcediagnosticsGather adaptive streaming telemetry data with AdaptiveMediaSourceDiagnostics

Die adaptivemediasource macht eine Diagnose Eigenschaft verfügbar, die ein adaptivemediasourcediagnostics -Objekt zurückgibt.The AdaptiveMediaSource exposes a Diagnostics property which returns an AdaptiveMediaSourceDiagnostics object. Verwenden Sie dieses Objekt, um sich für das diagnosticavailable -Ereignis zu registrieren.Use this object to register for the DiagnosticAvailable event. Dieses Ereignis ist für die Verwendung bei der telemetrieerfassung vorgesehen und sollte nicht zum Ändern des App-Verhaltens zur Laufzeit verwendet werden.This event is intended to be used for telemetry collection and should not be used to modify app behavior at runtime. Dieses Diagnose Ereignis wird aus vielen verschiedenen Gründen ausgelöst.This diagnostic event is raised for many different reasons. Überprüfen Sie die diagnostictype -Eigenschaft des adaptivemediasourcediagnosticavailableeventargs -Objekts, das an das-Ereignis übergeben wird, um zu bestimmen, warum das Ereignis ausgelöst wurde.Check the DiagnosticType property of the AdaptiveMediaSourceDiagnosticAvailableEventArgs object passed into the event to determine the reason that the event was raised. Mögliche Ursachen sind Fehler beim Zugriff auf die angeforderte Ressource und Fehler beim Parsen der Streaming-Manifest-Datei.Potential reasons include errors accessing the requested resource and errors parsing the streaming manifest file. Eine Liste der Situationen, in denen ein Diagnose Ereignis auftreten kann, finden Sie unter adaptivemediasourcediagnostictype.For a list of situations that can trigger a diagnostic event, see AdaptiveMediaSourceDiagnosticType. Wie die Argumente anderer adaptiver streamingereignisse bietet adaptivemediasourcediagnosticavailableeventargs eine RequestId- Eigenschaft für das korrelieren von Anforderungs Informationen zwischen verschiedenen Ereignissen.Like the arguments for other adaptive streaming events, the AdaptiveMediaSourceDiagnosticAvailableEventArgs provides a RequestId propery for correlating request information between different events.

private void DiagnosticAvailable(AdaptiveMediaSourceDiagnostics sender, AdaptiveMediaSourceDiagnosticAvailableEventArgs args)
{
    MySendTelemetryFunction(args.RequestId, args.Position,
                            args.DiagnosticType, args.SegmentId,
                            args.ResourceType, args.ResourceUri,
                            args.ResourceDuration, args.ResourceContentType,
                            args.ResourceByteRangeOffset,
                            args.ResourceByteRangeLength, 
                            args.Bitrate,
                            args.ExtendedError);

}

Zurückstellen der Bindung von adaptiver Streaminginhalt für Elemente in einer Wiedergabeliste mithilfe von "-"Defer binding of adaptive streaming content for items in a playback list by using MediaBinder

Mit der Klasse "die Klasse" können Sie die Bindung von Medieninhalten in einer mediaplaybacklistverzögern.The MediaBinder class allows you to defer binding of media content in a MediaPlaybackList. Ab Windows 10, Version 1703, können Sie eine adaptivemediasource als gebundenen Inhalt bereitstellen.Starting with Windows 10, version 1703, you can supply an AdaptiveMediaSource as bound content. Der Prozess für die verzögerte Bindung einer adaptiven Medienquelle ist größtenteils mit der Bindung anderer Medientypen identisch, die unter Medienelemente, Wiedergabelisten und Spurenbeschrieben werden.The process for deferred binding of an adaptive media source is largely the same as binding other types of media, which is described in Media items, playlists, and tracks.

Erstellen Sie eine -Instanz, und legen Sie eine APP-definierte Tokenzeichenfolge fest, um den zu gebundenen Inhalt zu identifizieren, und registrieren Sie sich für das Token Bindungs Ereignis.Create a MediaBinder instance, set an app-defined Token string to identify the content to be bound, and register for the Binding event. Erstellen Sie eine MediaSource aus dem Binder , indem Sie MediaSource. createfrommediabinderaufrufen.Create a MediaSource from the Binder by calling MediaSource.CreateFromMediaBinder. Erstellen Sie dann ein mediaplaybackitem-Element aus der MediaSource , und fügen Sie es der Wiedergabeliste hinzu.Then, create a MediaPlaybackItem from the MediaSource and add it to the playback list.

_mediaPlaybackList = new MediaPlaybackList();

var binder = new MediaBinder();
binder.Token = "MyBindingToken1";
binder.Binding += Binder_Binding;
_mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder)));

binder = new MediaBinder();
binder.Token = "MyBindingToken2";
binder.Binding += Binder_Binding;
_mediaPlaybackList.Items.Add(new MediaPlaybackItem(MediaSource.CreateFromMediaBinder(binder)));

_mediaPlayer = new MediaPlayer();
_mediaPlayer.Source = _mediaPlaybackList;
mediaPlayerElement.SetMediaPlayer(_mediaPlayer);

Verwenden Sie im Bindungs Ereignishandler die Tokenzeichenfolge, um den Inhalt zu identifizieren, der gebunden werden soll, und erstellen Sie dann die Adaptive Medienquelle, indem Sie eine der über Ladungen von createfromstreamasync oder createfromuriasync aufrufen.In the Binding event handler, use the token string to identify the content to be bound and then create the adaptive media source by calling one of the overloads of CreateFromStreamAsync or CreateFromUriAsync. Da es sich hierbei um asynchrone Methoden handelt, sollten Sie zuerst die Methode "-Methode . getdeferral " aufrufen, um das System anzuweisen, auf den Abschluss des Vorgangs zu warten, bevor Sie fortfahren.Because these are asynchronous methods, you should first call the MediaBindingEventArgs.GetDeferral method to instruct the system to wait for your operation to complete before continuing. Legen Sie die Adaptive Medienquelle als gebundenen Inhalt fest, indem Sie setadaptivemediasource aufrufen.Set the adaptive media source as the bound content by calling SetAdaptiveMediaSource. Zum Schluss wird " Deferral. Complete " aufgerufen, nachdem der Vorgang beendet wurde, um das System anzuweisen, fortzufahren.Finally, call Deferral.Complete after your operation is complete to instruct the system to continue.

private async void Binder_Binding_AdaptiveMediaSource(MediaBinder sender, MediaBindingEventArgs args)
{
    var deferral = args.GetDeferral();

    var contentUri = new Uri($"http://contoso.com/media/{args.MediaBinder.Token}");
    AdaptiveMediaSourceCreationResult result = await AdaptiveMediaSource.CreateFromUriAsync(contentUri);

    if (result.MediaSource != null)
    {
        args.SetAdaptiveMediaSource(result.MediaSource);
    }
    args.SetUri(contentUri);

    deferral.Complete();
}

Wenn Sie Ereignishandler für die gebundene Adaptive Medienquelle registrieren möchten, können Sie dies im Handler für das Ereignis " " in der Datei " mediaplaybacklist" durchführen.If you want to register event handlers for the bound adaptive media source, you can do this in the handler for the CurrentItemChanged event of the MediaPlaybackList. Die currentmediaplaybackitemchangedebug-args. netwitem -Eigenschaft enthält die neue, derzeit in der Liste wiedergegebene mediaplaybackitem .The CurrentMediaPlaybackItemChangedEventArgs.NewItem property contains the new currently playing MediaPlaybackItem in the list. Sie erhalten eine Instanz von adaptivemediasource , die das neue Element darstellt, indem Sie auf die Source -Eigenschaft von mediaplaybackitem und dann auf die adaptivemediasource -Eigenschaft der Medienquelle zugreifen.Get an instance of the AdaptiveMediaSource representing the new item by accessing the Source property of the MediaPlaybackItem and then the AdaptiveMediaSource property of the media source. Diese Eigenschaft ist NULL, wenn es sich bei dem neuen Wiedergabe Element nicht um eine adaptivemediasourcehandelt. Daher sollten Sie auf NULL testen, bevor Sie versuchen, Handler für die Ereignisse eines beliebigen Objekts zu registrieren.This property will be null if the new playback item is not an AdaptiveMediaSource, so you should test for null before attempting to register handlers for any of the object's events.

private void AMSMediaPlaybackList_CurrentItemChanged(MediaPlaybackList sender, CurrentMediaPlaybackItemChangedEventArgs args)
{
    if (!(args.NewItem is null))
    {
        var ams = args.NewItem.Source.AdaptiveMediaSource;
        if (!(ams is null))
        {
            ams.PlaybackBitrateChanged += Ams_PlaybackBitrateChanged;
        }
    }
}