システム メディア トランスポート コントロールとの統合

この記事では、システム メディア トランスポート コントロール (SMTC) と対話する方法について説明します。 SMTC は、すべての Windows 10 デバイスに共通する一連のコントロールであり、 MediaPlayer を使用するすべての実行中のアプリのメディア再生をユーザーが一貫して制御する方法を提供します。

システム メディア トランスポート コントロールを使用すると、メディア アプリケーション開発者は、組み込みのシステム UI と統合して、アーティスト、アルバム タイトル、チャプター タイトルなどのメディア メタデータを表示できます。 また、システム トランスポート コントロールを使用すると、ユーザーは、再生を一時停止したり、再生リストで前後にスキップしたりするなど、組み込みのシステム UI を使用してメディア アプリの再生を制御できます。

システム メディアのトランスポート コントロール

SMTC との統合を示す完全なサンプルについては、github の System Media Transport Controls サンプルを参照してください。

SMTC との自動統合

Windows 10 バージョン 1607 以降では、 MediaPlayer クラスを使用してメディアを再生する UWP アプリは、既定で SMTC と自動的に統合されます。 MediaPlayerの新しいインスタンスをインスタンス化し、MediaSourceMediaPlaybackItem、または MediaPlaybackList をプレイヤーの Source プロパティに割り当てるだけで、ユーザーは SMTC にアプリ名を表示し、SMTC コントロールを使用して再生、一時停止、および再生リスト間を移動できます。

アプリでは、複数の MediaPlayer オブジェクトを一度に作成して使用できます。 アプリ内のアクティブな MediaPlayer インスタンスごとに、SMTC に個別のタブが作成され、ユーザーはアクティブなメディア プレーヤーと実行中の他のアプリのプレーヤーを切り替えることができます。 SMTC で現在選択されているメディア プレーヤーは、コントロールが影響を受けるメディア プレーヤーです。

アプリで MediaPlayer を使用する方法 (XAML ページの MediaPlayerElement へのバインドなど) の詳細については、「 MediaPlayer でオーディオとビデオを再生する」を参照してください。

MediaSourceMediaPlaybackItem、および MediaPlaybackList の操作の詳細については、「Media アイテム、プレイリスト、トラック」を参照してください

SMTC によって表示されるメタデータを追加する

ビデオや曲のタイトルなど、SMTC 内のメディア項目に表示されるメタデータを追加または変更する場合は、メディアアイテムを表す MediaPlaybackItem の表示プロパティを更新する必要があります。 まず、GetDisplayProperties を呼び出して、MediaItemDisplayProperties オブジェクトへの参照を取得します。 次に、 Type プロパティを使用して、項目のメディア、音楽、ビデオの種類を設定します。 その後、指定したメディアの種類に応じて、 MusicProperties または VideoProperties のフィールドを設定できます。 最後に、 ApplyDisplayProperties を呼び出して、メディア項目のメタデータを更新します。

MediaItemDisplayProperties props = mediaPlaybackItem.GetDisplayProperties();
props.Type = Windows.Media.MediaPlaybackType.Video;
props.VideoProperties.Title = "Video title";
props.VideoProperties.Subtitle = "Video subtitle";
props.VideoProperties.Genres.Add("Documentary");
mediaPlaybackItem.ApplyDisplayProperties(props);
props = mediaPlaybackItem.GetDisplayProperties();
props.Type = Windows.Media.MediaPlaybackType.Music;
props.MusicProperties.Title = "Song title";
props.MusicProperties.Artist = "Song artist";
props.MusicProperties.Genres.Add("Polka");
mediaPlaybackItem.ApplyDisplayProperties(props);

Note

システム メディア トランスポート コントロールによって表示される他のメディア メタデータがアプリによって提供されない場合も、アプリには Type プロパティの値を設定する必要があります。 この値を使用すると、再生中にスクリーン セーバーがアクティブ化されないようにするなど、システムによるメディア コンテンツの正しい処理が促進されます。

CommandManager を使用して、既定の SMTC コマンドを変更またはオーバーライドする

アプリは、SMTC コントロールの動作を MediaPlaybackCommandManager クラスで変更または完全にオーバーライドできます。 コマンド マネージャー インスタンスは、CommandManager プロパティにアクセスすることで、MediaPlayer クラスの各インスタンスに対して取得できます。

既定で MediaPlaybackList の次の項目にスキップする Next コマンドなど、すべてのコマンドについて、コマンド マネージャーは、受信したイベント (NextReceived、およびコマンドの動作を管理するオブジェクト (NextBehavior など) を公開

次の例では、NextReceived イベントのハンドラーと、NextBehaviorIsEnabledChanged イベントのハンドラーを登録します。

_mediaPlayer.CommandManager.NextReceived += CommandManager_NextReceived;
_mediaPlayer.CommandManager.NextBehavior.IsEnabledChanged += NextBehavior_IsEnabledChanged;

次の例は、ユーザーがプレイリスト内の 5 つの項目をクリックした後に Next コマンドを無効にするシナリオを示しています。コンテンツの再生を続行する前に、ユーザーの操作が必要になる場合があります。 各 ## NextReceived イベントが発生すると、カウンターがインクリメントされます。 カウンターがターゲット番号に達すると、Next コマンドの EnablingRuleNever に設定され、コマンドが無効になります。

int _nextPressCount = 0;
private void CommandManager_NextReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerNextReceivedEventArgs args)
{
    _nextPressCount++;
    if (_nextPressCount > 5)
    {
        sender.NextBehavior.EnablingRule = MediaCommandEnablingRule.Never;
        // Perform app tasks while the Next button is disabled
    }
}

コマンドを Always に設定することもできます。つまり、 Next コマンドの例では、プレイリストに項目が存在しなくなった場合でも、コマンドは常に有効になります。 または、コマンドを Auto に設定して、再生中の現在のコンテンツに基づいてコマンドを有効にするかどうかをシステムが判断することもできます。

上記のシナリオでは、ある時点で、アプリは Next コマンドを再び有効にする必要があり、 EnablingRuleAuto に設定することで有効になります。

_mediaPlayer.CommandManager.NextBehavior.EnablingRule = MediaCommandEnablingRule.Auto;
_nextPressCount = 0;

アプリには、フォアグラウンドでの再生を制御するための独自の UI がある場合があるため、IsEnabledChanged イベントを使用して、ハンドラーに渡された MediaPlaybackCommandManagerCommandBehaviorIsEnabledにアクセスして、SMTC に一致するように独自の UI を更新できます。

private void NextBehavior_IsEnabledChanged(MediaPlaybackCommandManagerCommandBehavior sender, object args)
{
    MyNextButton.IsEnabled = sender.IsEnabled;
}

場合によっては、SMTC コマンドの動作を完全にオーバーライドすることが必要になる場合があります。 次の例は、アプリで Next コマンドと Previous コマンドを使用して、現在のプレイリスト内のトラック間をスキップするのではなく、インターネット ラジオ 局を切り替えるシナリオを示しています。 前の例と同様に、ハンドラーはコマンドの受信時に登録されます。この場合は、 PreviousReceived イベントです。

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

PreviousReceived ハンドラーでは、そのハンドラーに渡された MediaPlaybackCommandManagerPreviousReceivedEventArgsGetDeferral を呼び出すことにより、まず Deferral が取得されます。 これにより、遅延が完了するまで待機してからコマンドを実行するようにシステムに指示します。 これは、ハンドラーで非同期呼び出しを行う場合に非常に重要です。 この時点で、この例では、前のラジオ 局を表す MediaPlaybackItem を返すカスタム メソッドを呼び出します。

次に、 Handled プロパティがチェックされ、イベントが別のハンドラーによってまだ処理されていないかどうかが確認されます。 そうでない場合、 Handled プロパティは true に設定されます。 これにより、SMTC およびその他のサブスクライブされたハンドラーは、既に処理されているため、このコマンドを実行するためのアクションを実行する必要がないことを認識できます。 その後、コードによってメディア プレーヤーの新しいソースが設定され、プレーヤーが開始されます。

最後に、遅延オブジェクトに対して Complete が呼び出され、コマンドの処理が完了したことをシステムに通知します。

private async void CommandManager_PreviousReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerPreviousReceivedEventArgs args)
{
    var deferral = args.GetDeferral();
    MediaPlaybackItem mediaPlaybackItem = await GetPreviousStation();

    if(args.Handled != true)
    {
        args.Handled = true;
        sender.MediaPlayer.Source = mediaPlaybackItem;
        sender.MediaPlayer.Play();
    }
    deferral.Complete();
}

SMTC の手動制御

この記事で既に説明したように、SMTC は、アプリが作成する MediaPlayer のすべてのインスタンスの情報を自動的に検出して表示します。 MediaPlayer の複数のインスタンスを使用する場合 SMTC でアプリの 1 つのエントリを提供する場合は、自動統合に依存するのではなく、SMTC の動作を手動で制御する必要があります。 また、 MediaTimelineController を使用して 1 つ以上のメディア プレーヤーを制御する場合は、SMTC の手動統合を使用する必要があります。 また、AudioGraph クラスなどの MediaPlayer 以外の API を使用してメディアを再生する場合は、ユーザーが SMTC を使用してアプリを制御するための手動 SMTC 統合を実装する必要があります。 SMTC を手動で制御する方法については、「 システム メディア トランスポート コントロールの管理」を参照してください