アダプティブ ストリーミングAdaptive streaming

この記事では、ユニバーサル Windows プラットフォーム (UWP) アプリにアダプティブ ストリーミング マルチメディア コンテンツの再生を追加する方法について説明します。This article describes how to add playback of adaptive streaming multimedia content to a Universal Windows Platform (UWP) app. この機能では、HTTP ライブ ストリーミング (HLS) と Dynamic Adaptive Streaming over HTTP (DASH) コンテンツの再生がサポートされています。This feature supports playback of Http Live Streaming (HLS) and Dynamic Streaming over HTTP (DASH) content. Windows 10 バージョン 1803 以降では、 AdaptiveMediaSource によってスムーズ ストリーミングがサポートされています。Starting with Windows 10, version 1803, Smooth Streaming is supported by AdaptiveMediaSource.

サポートされている HLS プロトコル タグの一覧については、「HLS タグのサポート」をご覧ください。For a list of supported HLS protocol tags, see HLS tag support.

サポートされている DASH プロファイルの一覧については、「DASH プロファイルのサポート」をご覧ください。For a list of supported DASH profiles, see DASH profile support.

注意

この記事のコードは、UWP のアダプティブ ストリーミングのサンプルを基にしています。The code in this article was adapted from the UWP Adaptive streaming sample.

MediaPlayer と MediaPlayerElement を使った簡単なアダプティブ ストリーミングSimple adaptive streaming with MediaPlayer and MediaPlayerElement

UWP アプリでアダプティブ ストリーミング メディアを再生するには、DASH または HLS のマニフェスト ファイルを指す Uri オブジェクトを作成します。To play adaptive streaming media in a UWP app, create a Uri object pointing to a DASH or HLS manifest file. MediaPlayer クラスのインスタンスを作成します。Create an instance of the MediaPlayer class. MediaSource.CreateFromUri を呼び出して新しい MediaSource オブジェクトを作成し、それを MediaPlayerSource プロパティに設定します。Call MediaSource.CreateFromUri to create a new MediaSource object and then set that to the Source property of the MediaPlayer. Play を呼び出してメディア コンテンツの作成を開始します。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();

上の例では、メディア コンテンツのオーディオが再生されますが、UI 内のコンテンツは自動的にレンダリングされません。The above example will play the audio of the media content but it doesn't automatically render the content in your UI. ビデオ コンテンツを再生するほとんどのアプリは、XAML ページでコンテンツをレンダリングします。Most apps that play video content will want to render the content in a XAML page. これを行うには、XAML ページに MediaPlayerElement コントロールを追加します。To do this, add a MediaPlayerElement control to your XAML page.

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

MediaSource.CreateFromUri を呼び出して、DASH や HLS のマニフェスト ファイルの URI から MediaSource を作成します。Call MediaSource.CreateFromUri to create a MediaSource from the URI of a DASH or HLS manifest file. その後、MediaPlayerElementSource プロパティを設定します。Then set the Source property of the MediaPlayerElement. MediaPlayerElementによって、コンテンツの新しい MediaPlayer オブジェクトが自動的に作成されます。The MediaPlayerElement will automatically create a new MediaPlayer object for the content. MediaPlayerPlay を呼び出して、コンテンツの再生を開始できます。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();

注意

Windows 10 バージョン 1607 以降、メディア項目の再生には、MediaPlayer クラスを使うことをお勧めします。Starting with Windows 10, version 1607, it is recommended that you use the MediaPlayer class to play media items. MediaPlayerElement は、XAML ページの MediaPlayer コンテンツをレンダリングするために使われる軽量の XAML コントロールです。The MediaPlayerElement is a lightweight XAML control that is used to render the content of a MediaPlayer in a XAML page. 下位互換性を確保するため、MediaElementコントロールも引き続きサポートされています。The MediaElement control continues to be supported for backwards compatibility. MediaPlayerMediaPlayerElement を使ってメディア コンテンツを再生する方法について詳しくは、「MediaPlayer を使ったオーディオとビデオの再生」をご覧ください。For more information about using MediaPlayer and MediaPlayerElement to play media content, see Play audio and video with MediaPlayer. MediaSource と関連の API を使ってメディア コンテンツを操作する方法について詳しくは、「メディア項目、プレイリスト、トラック」をご覧ください。For information about using MediaSource and related APIs to work with media content, see Media items, playlists, and tracks.

AdaptiveMediaSource を使ったアダプティブ ストリーミングAdaptive streaming with AdaptiveMediaSource

アプリで、より高度なアダプティブ ストリーミング機能 (カスタム HTTP ヘッダーの指定、現在のダウンロードや再生のビットレートの監視、アダプティブ ストリーミングのビットレートをシステムで切り替えるタイミングを決定する比率の調整など) を必要とする場合は、 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.

アダプティブ ストリーミング API は、Windows.Media.Streaming.Adaptive 名前空間にあります。The adaptive streaming APIs are found in the Windows.Media.Streaming.Adaptive namespace. この記事の例には、以下の名前空間の API が使われています。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;

URI から AdaptiveMediaSource を初期化するInitialize an AdaptiveMediaSource from a URI.

CreateFromUriAsync を呼び出し、アダプティブ ストリーミング マニフェスト ファイルの URI で、AdaptiveMediaSource を初期化します。Initialize the AdaptiveMediaSource with the URI of an adaptive streaming manifest file by calling CreateFromUriAsync. このメソッドから返される AdaptiveMediaSourceCreationStatus の値を利用して、メディア ソースが正しく作成されたかどうかを確認できます。The AdaptiveMediaSourceCreationStatus value returned from this method lets you know if the media source was created successfully. 正しく作成されている場合、オブジェクトを MediaPlayer のストリーム ソースとして設定できます。そのためには、MediaSource.CreateFromAdaptiveMediaSource を呼び出して MediaSource オブジェクトを作成し、このオブジェクトをメディア プレーヤーの Source プロパティに割り当てます。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. この例では、AvailableBitrates プロパティを照会することによって、このストリームで利用できる最大ビットレートを特定し、その値が初期ビットレートとして設定されます。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. またこの例では、AdaptiveMediaSource のいくつかのイベントのハンドラーも登録します。これらのイベントについては、この記事の後半で説明します。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}");
    }
}



HttpClient を使用して AdaptiveMediaSource を初期化するInitialize an AdaptiveMediaSource using HttpClient

マニフェスト ファイルを取得するためにカスタム HTTP ヘッダーを設定する場合は、HttpClient オブジェクトを作成し、目的のヘッダーを設定してから、そのオブジェクトを 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);

DownloadRequested イベントは、システムがサーバーからリソースの取得を試みるときに発生します。The DownloadRequested event is raised when the system is about to retrieve a resource from the server. イベント ハンドラーに渡される AdaptiveMediaSourceDownloadRequestedEventArgs によって、要求されているリソースに関する情報 (リソースの種類や URI など) を提供するプロパティが公開されます。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.

DownloadRequested イベントを使ってリソース要求プロパティを変更するModify resource request properties using the DownloadRequested event

DownloadRequested イベント ハンドラーを使って、リソース要求を変更することができます。この場合、イベント引数によって提供される AdaptiveMediaSourceDownloadResult オブジェクトのプロパティを更新します。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. 次の例では、結果オブジェクトの ResourceUri プロパティを更新して、リソースの取得元となる URI を変更します。In the example below, the URI from which the resource will be retrieved is modified by updating the ResourceUri properties of the result object. メディア セグメントのバイト範囲オフセットや長さを書き換えたり、次の例に示すようにリソース URI を変更して完全なリソースをダウンロードし、バイト範囲のオフセットと長さを 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.

結果オブジェクトの Buffer プロパティや InputStream プロパティを設定することによって、要求したリソースの内容を置き換えることができます。You can override the content of the requested resource by setting the Buffer or InputStream properties of the result object. 次の例では、Buffer プロパティを設定することによって、マニフェスト リソースの内容が置き換わります。In the example below, the contents of the manifest resource are replaced by setting the Buffer property. 非同期的に取得したデータを使ってリソース要求を更新する場合は (リモート サーバーや非同期ユーザー認証からデータを取得する場合など)、AdaptiveMediaSourceDownloadRequestedEventArgs.GetDeferral を呼び出して遅延を取得する必要があります。その後、操作が完了して、ダウンロード要求操作が継続可能なことをシステムに通知するときに、Complete を呼び出してください。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;
        }
    }

ビットレート イベントを使用して、ビットレートの変更を管理し変更に応答するUse bitrate events to manage and respond to bitrate changes

AdaptiveMediaSource オブジェクトは、ダウンロードや再生のビットレートが変わったときに対応できるようにするイベントを提供します。The AdaptiveMediaSource object provides events that allow you to react when the download or playback bitrates change. この例では、現在のビットレートが UI で簡単に更新されます。In this example, the current bitrates are simply updated in the UI. また、アダプティブ ストリーミングのビットレートをシステムで切り替えるタイミングを決定する比率を変更できることに注意してください。Note that you can modify the ratios that determine when the system switches bitrates of the adaptive stream. 詳しくは、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();
    }));
}

ダウンロードの完了と失敗イベントを処理するHandle download completion and failure events

AdaptiveMediaSource オブジェクトは、要求されたリソースのダウンロードが失敗したときに、DownloadFailed イベントを発生させます。The AdaptiveMediaSource object raises the DownloadFailed event when the download of a requested resource fails. このイベントを使用して、エラーに応じて UI を更新できます。You can use this event to update your UI in response to the failure. このイベントを使用して、ダウンロード操作とエラーに関する統計情報をログに記録することもできます。You can also use the event to log statistical information about the download operation and the failure.

イベント ハンドラーに渡される AdaptiveMediaSourceDownloadFailedEventArgs オブジェクトには、リソースの種類、リソースの URI、ストリーム内のエラーが発生した位置など、失敗したリソースのダウンロードに関するメタデータが含まれています。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 は、複数のイベント間で、個々の要求に関する状態情報を関連付けるために使用できる、システムで生成された一意の識別子を取得します。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.

Statistics プロパティは、AdaptiveMediaSourceDownloadStatistics オブジェクトを返します。このオブジェクトは、イベントの発生時や、ダウンロード操作のさまざまなマイルストーンのタイミングで受信したバイト数に関する詳細情報を提供します。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. この情報は、アダプティブ ストリーミングの実装でパフォーマンスの問題を識別するためにろぐに記録できます。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);

}

DownloadCompleted イベントは、リソースのダウンロードが完了したときに発生し、DownloadFailed イベントと同様のデータを提供します。The DownloadCompleted event occurs when a resource download completes and provdes similar data to the DownloadFailed event. ここでも、1 つの要求のイベントを関連付けるために RequestId が提供されます。Once again, a RequestId is provided for correlating events for a single request. また、ダウンロード統計情報のログ記録を有効にするために、AdaptiveMediaSourceDownloadStatistics オブジェクトが提供されます。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);

}

AdaptiveMediaSourceDiagnostics によってアダプティブ ストリーミングの利用統計情報を収集するGather adaptive streaming telemetry data with AdaptiveMediaSourceDiagnostics

AdaptiveMediaSource は、AdaptiveMediaSourceDiagnostics オブジェクトを返す Diagnostics プロパティを公開します。The AdaptiveMediaSource exposes a Diagnostics property which returns an AdaptiveMediaSourceDiagnostics object. このオブジェクトを使って、DiagnosticAvailable イベントを登録します。Use this object to register for the DiagnosticAvailable event. このイベントは、利用統計情報の収集に使用することを目的としており、実行時にアプリの動作を変更するために使用することはできません。This event is intended to be used for telemetry collection and should not be used to modify app behavior at runtime. この診断イベントは、さまざまな理由で発生します。This diagnostic event is raised for many different reasons. イベントが発生した理由を特定するには、イベントに渡される AdaptiveMediaSourceDiagnosticAvailableEventArgs オブジェクトの DiagnosticType プロパティを確認します。Check the DiagnosticType property of the AdaptiveMediaSourceDiagnosticAvailableEventArgs object passed into the event to determine the reason that the event was raised. 潜在的な理由には、要求されたリソースへのアクセス時のエラーや、ストリーミング マニフェスト ファイルの解析時のエラーが含まれます。Potential reasons include errors accessing the requested resource and errors parsing the streaming manifest file. 診断イベントをトリガーできる状況の一覧については、AdaptiveMediaSourceDiagnosticType を参照してください。For a list of situations that can trigger a diagnostic event, see AdaptiveMediaSourceDiagnosticType. 他のアダプティブ ストリーミング イベントの引数と同様に、AdaptiveMediaSourceDiagnosticAvailableEventArgs は、さまざまなイベントの間で要求情報を関連付けるための RequestId プロパティを提供します。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);

}

MediaBinder を使用して、再生リスト内の項目のアダプティブ ストリーミング コンテンツのバインドを延期するDefer binding of adaptive streaming content for items in a playback list by using MediaBinder

MediaBinder クラスによって、MediaPlaybackList 内のメディア コンテンツのバインドを延期することができます。The MediaBinder class allows you to defer binding of media content in a MediaPlaybackList. Windows 10 Version 1703 以降では、バインドされるコンテンツとして AdaptiveMediaSource を指定できます。Starting with Windows 10, version 1703, you can supply an AdaptiveMediaSource as bound content. アダプティブ メディア ソースの遅延バインドのプロセスの大部分は、「メディア項目、プレイリスト、トラック」で説明されている、他の種類のメディアのバインドと同じです。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.

MediaBinder インスタンスを作成し、アプリで定義された、バインドされるコンテンツを識別するための Token 文字列を設定して、Binding イベントに登録します。Create a MediaBinder instance, set an app-defined Token string to identify the content to be bound, and register for the Binding event. MediaSource.CreateFromMediaBinder を呼び出すことによって、Binder から MediaSource を作成します。Create a MediaSource from the Binder by calling MediaSource.CreateFromMediaBinder. 次に、MediaSource から MediaPlaybackItem を作成し、再生リストに追加します。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);

Binding イベント ハンドラーでは、トークン文字列を使用してバインドされるコンテンツを識別し、 CreateFromStreamAsync または 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. これらは非同期メソッドであるため、最初に MediaBindingEventArgs.GetDeferral メソッドを呼び出して、操作が完了するまで待機してから続行するようにシステムに指示する必要があります。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. SetAdaptiveMediaSource を呼び出すことによって、バインドされるコンテンツとして、アダプティブ メディア ソースを設定します。Set the adaptive media source as the bound content by calling SetAdaptiveMediaSource. 最後に、操作が完了した後、Deferral.Complete を呼び出して、システムに続行を指示します。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();
}

バインドされているアダプティブ メディア ソースのイベント ハンドラーを登録する場合は、MediaPlaybackListCurrentItemChanged イベントのハンドラーでこれを実行できます。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. CurrentMediaPlaybackItemChangedEventArgs.NewItem プロパティには、リスト内で現在再生中の新しい MediaPlaybackItem が含まれます。The CurrentMediaPlaybackItemChangedEventArgs.NewItem property contains the new currently playing MediaPlaybackItem in the list. 新しい項目を表す AdaptiveMediaSource インスタンスを取得するには、MediaPlaybackItemSource プロパティにアクセスし、次にメディア ソースの AdaptiveMediaSource プロパティにアクセスします。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. 新しい再生項目が AdaptiveMediaSource ではない場合、このプロパティは null になるため、このオブジェクトのイベントのハンドラーを登録する前に、これが null であることをテストする必要があります。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;
        }
    }
}