Diffusion en continu adaptativeAdaptive streaming

Cet article décrit comment ajouter la lecture de contenu multimédia en streaming adaptatif à une application de plateforme Windows universelle (UWP).This article describes how to add playback of adaptive streaming multimedia content to a Universal Windows Platform (UWP) app. Cette fonctionnalité prend en charge la lecture de contenu http live streaming (TLS) et streaming dynamique sur HTTP (DASH).This feature supports playback of Http Live Streaming (HLS) and Dynamic Streaming over HTTP (DASH) content. À compter de Windows 10, la version 1803, Smooth Streaming est pris en charge par AdaptiveMediaSource.Starting with Windows 10, version 1803, Smooth Streaming is supported by AdaptiveMediaSource.

Pour obtenir la liste des balises de protocole HLS prises en charge, voir Prise en charge des balises HLS.For a list of supported HLS protocol tags, see HLS tag support.

Pour obtenir la liste des profils de TIREts pris en charge, consultez prise en charge des profils Dash.For a list of supported DASH profiles, see DASH profile support.

Notes

Le code de cet article a été adapté à partir de l’exemple de streaming adaptatif UWP.The code in this article was adapted from the UWP Adaptive streaming sample.

Streaming adaptatif avec MediaPlayer et MediaPlayerElementSimple adaptive streaming with MediaPlayer and MediaPlayerElement

Pour lire du contenu multimédia en streaming adaptatif dans une application UWP, créez un objet URI pointant sur un fichier manifeste HLS ou DASH.To play adaptive streaming media in a UWP app, create a Uri object pointing to a DASH or HLS manifest file. Créez une instance de la classe MediaPlayer .Create an instance of the MediaPlayer class. Appelez MediaSource.CreateFromUri pour créer un objet MediaSource, puis définissez-le sur la propriété Source de MediaPlayer.Call MediaSource.CreateFromUri to create a new MediaSource object and then set that to the Source property of the MediaPlayer. Appelez Play pour démarrer la lecture du contenu multimédia.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();

L’exemple ci-dessus lit l’audio du contenu multimédia, mais n’affiche pas automatiquement le contenu dans votre interface Utilisateur.The above example will play the audio of the media content but it doesn't automatically render the content in your UI. La plupart des applications qui lisent du contenu vidéo veulent restituer le contenu dans une page XAML.Most apps that play video content will want to render the content in a XAML page. Pour ce faire, ajoutez un contrôle MediaPlayerElement à votre page XAML.To do this, add a MediaPlayerElement control to your XAML page.

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

Appelez MediaSource.CreateFromUri pour créer un MediaSource à partir de l’URI d’un fichier manifeste HLS ou DASH.Call MediaSource.CreateFromUri to create a MediaSource from the URI of a DASH or HLS manifest file. Ensuite, définissez la propriété Source de MediaPlayerElement.Then set the Source property of the MediaPlayerElement. MediaPlayerElement crée automatiquement un objet MediaPlayer pour le contenu.The MediaPlayerElement will automatically create a new MediaPlayer object for the content. Vous pouvez appeler Play sur MediaPlayer pour démarrer la lecture du contenu.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();

Notes

À compter de Windows 10, version 1607, nous vous recommandons d’utiliser la classe MediaPlayer pour lire des éléments multimédias.Starting with Windows 10, version 1607, it is recommended that you use the MediaPlayer class to play media items. MediaPlayerElement est un contrôle XAML léger utilisé pour afficher le contenu d’un MediaPlayer dans une page XAML.The MediaPlayerElement is a lightweight XAML control that is used to render the content of a MediaPlayer in a XAML page. Le contrôle MediaElement continue d’être pris en charge pour la compatibilité descendante.The MediaElement control continues to be supported for backwards compatibility. Pour plus d’informations sur l’utilisation de MediaPlayer et MediaPlayerElement pour lire du contenu multimédia, voir Lire du contenu audio et vidéo avec MediaPlayer.For more information about using MediaPlayer and MediaPlayerElement to play media content, see Play audio and video with MediaPlayer. Pour plus d’informations sur l’utilisation de MediaSource et des API associées pour utiliser du contenu multimédia, voir Éléments, playlists et pistes multimédias.For information about using MediaSource and related APIs to work with media content, see Media items, playlists, and tracks.

Streaming adaptatif avec AdaptiveMediaSourceAdaptive streaming with AdaptiveMediaSource

Si votre application nécessite des fonctionnalités de diffusion en continu adaptative plus avancées, telles que la mise à disposition d’en-têtes HTTP personnalisés, la surveillance des débits de téléchargement et de lecture actuels, ou l’ajustement des ratios déterminant quand le système commute les débits binaires du flux adaptatif, utilisez l’objet AdaptiveMediaSource .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.

Les API de diffusion adaptative se trouvent dans l’espace de noms Windows. Media. streaming. adaptative .The adaptive streaming APIs are found in the Windows.Media.Streaming.Adaptive namespace. Les exemples de cet article utilisent des API provenant des espaces de noms suivants.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;

Initialise un AdaptiveMediaSource à partir d’un URI.Initialize an AdaptiveMediaSource from a URI.

Initialisez l’élément AdaptiveMediaSource avec l’URI d’un fichier manifeste de streaming adaptatif en appelant la méthode CreateFromUriAsync.Initialize the AdaptiveMediaSource with the URI of an adaptive streaming manifest file by calling CreateFromUriAsync. La valeur AdaptiveMediaSourceCreationStatus retournée par cette méthode vous permet de savoir si la source du média a été créée avec succès.The AdaptiveMediaSourceCreationStatus value returned from this method lets you know if the media source was created successfully. Si c’est le cas, vous pouvez définir l’objet comme source de flux pour votre MediaPlayer en créant un objet MediaSource en appelant MediaSource. CreateFromAdaptiveMediaSource, puis en l’affectant à la propriété source du lecteur multimédia.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. Dans cet exemple, la propriété AvailableBitrates est interrogée pour déterminer le débit maximal pris en charge pour ce flux, puis cette valeur est définie en tant que vitesse de transmission initiale.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. Cet exemple inscrit également des gestionnaires pour les différents événements AdaptiveMediaSource décrits plus loin dans cet article.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}");
    }
}

Initialiser un AdaptiveMediaSource à l’aide de HttpClientInitialize an AdaptiveMediaSource using HttpClient

Si vous avez besoin de définir des en-têtes HTTP personnalisés pour l’obtention du fichier manifeste, vous pouvez créer un objet HttpClient, définir les en-têtes souhaités, puis transmettre l’objet dans la surcharge de CreateFromUriAsync.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);

L’événement DownloadRequested est déclenché lorsque le système est sur le du serveur de récupérer une ressource.The DownloadRequested event is raised when the system is about to retrieve a resource from the server. La classe AdaptiveMediaSourceDownloadRequestedEventArgs transmise dans le gestionnaire d’événements expose les propriétés qui fournissent des informations sur la ressource demandée, telles que le type et l’URI de la ressource.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.

Modifier les propriétés d’une demande de ressource à l’aide de l’événement DownloadRequestedModify resource request properties using the DownloadRequested event

Vous pouvez utiliser le gestionnaire d’événements DownloadRequested pour modifier la demande de ressource en mettant à jour les propriétés de l’objet AdaptiveMediaSourceDownloadResult fourni par les arguments d’événement.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. Dans l’exemple ci-dessous, l’URI à partir duquel la ressource sera récupérée est modifié en mettant à jour les propriétés resourceuri de l’objet de résultat.In the example below, the URI from which the resource will be retrieved is modified by updating the ResourceUri properties of the result object. Vous pouvez également réécrire le décalage de la plage d’octets et la longueur des segments de média ou, comme illustré ci-dessous, modifier l’URI de ressource pour télécharger la ressource complète et définir le décalage de la plage d’octets et la longueur à null.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.

Vous pouvez remplacer le contenu de la ressource demandée en définissant les propriétés buffer ou InputStream de l’objet de résultat.You can override the content of the requested resource by setting the Buffer or InputStream properties of the result object. Dans l’exemple ci-après, le contenu de la ressource de manifeste est remplacé par la définition de la propriété Buffer.In the example below, the contents of the manifest resource are replaced by setting the Buffer property. Notez que si vous mettez à jour la demande de ressource avec des données obtenues en mode asynchrone, par exemple dans le cadre d’une récupération de données à partir d’un serveur distant ou d’une authentification utilisateur asynchrone, vous devez appeler AdaptiveMediaSourceDownloadRequestedEventArgs.GetDeferral pour obtenir un report, puis Complete une fois l’opération terminée pour signaler au système que l’opération de demande de téléchargement peut continuer.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;
        }
    }

Utiliser des événements de débit binaire pour gérer les modifications de débit et y répondreUse bitrate events to manage and respond to bitrate changes

L’objet AdaptiveMediaSource fournit des événements qui vous permettent de réagir lorsque les débits de téléchargement ou de lecture changent.The AdaptiveMediaSource object provides events that allow you to react when the download or playback bitrates change. Dans cet exemple, les débits actuels sont simplement mis à jour dans l’interface utilisateur.In this example, the current bitrates are simply updated in the UI. Notez que vous pouvez modifier les ratios qui déterminent le moment où le système change les débits du flux adaptatif.Note that you can modify the ratios that determine when the system switches bitrates of the adaptive stream. Pour plus d’informations, consultez la propriété AdvancedSettings .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();
    }));
}

Gérer les événements de réussite et d’échec du téléchargementHandle download completion and failure events

L’objet AdaptiveMediaSource déclenche l’événement DownloadFailed lorsque le téléchargement d’une ressource demandée échoue.The AdaptiveMediaSource object raises the DownloadFailed event when the download of a requested resource fails. Vous pouvez utiliser cet événement pour mettre à jour votre interface utilisateur en réponse à l’échec.You can use this event to update your UI in response to the failure. Vous pouvez également utiliser l’événement pour enregistrer des informations statistiques sur l’opération de téléchargement et l’échec.You can also use the event to log statistical information about the download operation and the failure.

L’objet AdaptiveMediaSourceDownloadFailedEventArgs passé dans le gestionnaire d’événements contient des métadonnées sur le téléchargement des ressources qui ont échoué, telles que le type de ressource, l’URI de la ressource et la position dans le flux où l’échec s’est produit.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. RequestId obtient un identificateur unique généré par le système pour la demande qui peut être utilisée pour mettre en corrélation les informations d’État relatives à une demande individuelle sur plusieurs événements.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.

La propriété Statistics retourne un objet AdaptiveMediaSourceDownloadStatistics qui fournit des informations détaillées sur le nombre d’octets reçus au moment de l’événement et le minutage des différentes étapes majeures dans l’opération de téléchargement.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. Vous pouvez consigner ces informations dans l’ordre pour identifier les problèmes de performances dans votre implémentation de streaming adaptative.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);

}

L’événement DownloadCompleted se produit lorsqu’un téléchargement de ressource est terminé et provdes des données similaires à l’événement DownloadFailed .The DownloadCompleted event occurs when a resource download completes and provdes similar data to the DownloadFailed event. Une fois encore, un ID de requête est fourni pour la corrélation des événements pour une demande unique.Once again, a RequestId is provided for correlating events for a single request. En outre, un objet AdaptiveMediaSourceDownloadStatistics est fourni pour activer la journalisation des statistiques de téléchargement.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);

}

Collectez des données de télémétrie de diffusion en continu adaptative avec AdaptiveMediaSourceDiagnosticsGather adaptive streaming telemetry data with AdaptiveMediaSourceDiagnostics

Le AdaptiveMediaSource expose une propriété de diagnostic qui retourne un objet AdaptiveMediaSourceDiagnostics .The AdaptiveMediaSource exposes a Diagnostics property which returns an AdaptiveMediaSourceDiagnostics object. Utilisez cet objet pour vous inscrire à l’événement DiagnosticAvailable .Use this object to register for the DiagnosticAvailable event. Cet événement est destiné à être utilisé pour la collecte de données de télémétrie et ne doit pas être utilisé pour modifier le comportement de l’application au moment de l’exécution.This event is intended to be used for telemetry collection and should not be used to modify app behavior at runtime. Cet événement de diagnostic est déclenché pour de nombreuses raisons différentes.This diagnostic event is raised for many different reasons. Vérifiez la propriété DiagnosticType de l’objet AdaptiveMediaSourceDiagnosticAvailableEventArgs passé dans l’événement pour déterminer la raison pour laquelle l’événement a été déclenché.Check the DiagnosticType property of the AdaptiveMediaSourceDiagnosticAvailableEventArgs object passed into the event to determine the reason that the event was raised. Les raisons possibles incluent des erreurs lors de l’accès à la ressource demandée et des erreurs lors de l’analyse du fichier manifeste de diffusion en continu.Potential reasons include errors accessing the requested resource and errors parsing the streaming manifest file. Pour obtenir la liste des situations pouvant déclencher un événement de diagnostic, consultez AdaptiveMediaSourceDiagnosticType.For a list of situations that can trigger a diagnostic event, see AdaptiveMediaSourceDiagnosticType. À l’instar des arguments pour d’autres événements de diffusion en continu adaptative, AdaptiveMediaSourceDiagnosticAvailableEventArgs fournit un ID de requête pour la corrélation des informations de demande entre différents événements.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);

}

Différer la liaison du contenu de diffusion en continu adaptative pour les éléments d’une liste de lecture à l’aide de MediaBinderDefer binding of adaptive streaming content for items in a playback list by using MediaBinder

La classe MediaBinder vous permet de différer la liaison de contenu multimédia dans un MediaPlaybackList.The MediaBinder class allows you to defer binding of media content in a MediaPlaybackList. À compter de Windows 10, version 1703, vous pouvez fournir un AdaptiveMediaSource comme contenu lié.Starting with Windows 10, version 1703, you can supply an AdaptiveMediaSource as bound content. Le processus de liaison différée d’une source de média adaptative est en grande partie identique à la liaison d’autres types de médias, qui est décrit dans éléments multimédias, sélections et pistes.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.

Créez une instance MediaBinder , définissez une chaîne de jeton définie par l’application pour identifier le contenu à lier et inscrivez-vous pour l’événement de liaison .Create a MediaBinder instance, set an app-defined Token string to identify the content to be bound, and register for the Binding event. Créez un MediaSource à partir du Binder en appelant MediaSource. CreateFromMediaBinder.Create a MediaSource from the Binder by calling MediaSource.CreateFromMediaBinder. Créez ensuite un MediaPlaybackItem à partir de MediaSource et ajoutez-le à la liste de lecture.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);

Dans le gestionnaire d’événements de liaison , utilisez la chaîne de jeton pour identifier le contenu à lier, puis créez la source de média adaptative en appelant l’une des surcharges de CreateFromStreamAsync ou CreateFromUriAsync.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. Étant donné qu’il s’agit de méthodes asynchrones, vous devez d’abord appeler la méthode MediaBindingEventArgs. GetDeferral pour indiquer au système d’attendre que l’opération se termine avant de continuer.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. Définissez la source de média adaptative comme contenu lié en appelant SetAdaptiveMediaSource.Set the adaptive media source as the bound content by calling SetAdaptiveMediaSource. Enfin, appelez Report. Complete une fois l’opération terminée pour demander au système de continuer.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();
}

Si vous souhaitez inscrire des gestionnaires d’événements pour la source de média adaptative liée, vous pouvez le faire dans le gestionnaire pour l’événement CurrentItemChanged de MediaPlaybackList.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. La propriété CurrentMediaPlaybackItemChangedEventArgs. newItem contient le nouveau MediaPlaybackItem en cours de création dans la liste.The CurrentMediaPlaybackItemChangedEventArgs.NewItem property contains the new currently playing MediaPlaybackItem in the list. Récupérez une instance du AdaptiveMediaSource représentant le nouvel élément en accédant à la propriété source de MediaPlaybackItem , puis à la propriété AdaptiveMediaSource de la source du média.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. Cette propriété a la valeur null si le nouvel élément de lecture n’est pas un AdaptiveMediaSource. vous devez donc tester la valeur null avant d’essayer d’enregistrer les gestionnaires pour les événements de l’objet.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;
        }
    }
}