従来のバックグラウンドでのメディアの再生Legacy background media playback

この記事では、UWP アプリにバックグラウンド オーディオのサポートを追加できる従来の 2 プロセスのモデルについて説明します。This article describes the legacy, two-process model for adding background audio support to your UWP app. Windows 10 バージョン 1607 以降では、バックグラウンド オーディオ用に 1 プロセスのモデルが提供されているため、より簡単に実装できます。Starting with Windows 10, version 1607, a single-process model for background audio that is much simpler to implement. バックグラウンド オーディオに対する現在の推奨事項について詳しくは、「バックグラウンドでのメディアの再生」をご覧ください。For more information on the current recommendations for background audio, see Play media in the background. この記事は、従来の 2 プロセスのモデルを使用して既に開発されたアプリにサポートを提供することを目的としています。This article is intended to provide support for apps that are have already been developed using the legacy two-process model.

注意

BackgroundMediaPlayerは、Windows、バージョン 1703 以降では推奨されなくなりましたし、Windows の将来のバージョンで利用可能なことができない可能性があります。Starting with Windows, version 1703, BackgroundMediaPlayer is deprecated and may not be available in future versions of Windows.

バックグラウンド オーディオのアーキテクチャBackground audio architecture

バックグラウンド再生を実行するアプリは、2 つのプロセスで構成されています。An app performing background playback consists of two processes. 最初のプロセスはメイン アプリです。アプリ UI とクライアント ロジックを含んでおり、フォアグラウンドで実行されます。The first process is the main app, which contains the app UI and client logic, running in the foreground. 2 番目のプロセスはバックグラウンド再生タスクです。すべての UWP アプリのバックグラウンド タスクと同様、IBackgroundTask を実装しています。The second process is the background playback task, which implements IBackgroundTask like all UWP app background tasks. バックグラウンド タスクには、オーディオ再生のロジックとバックグラウンド サービスが含まれています。The background task contains the audio playback logic and background services. バックグラウンド タスクは、システム メディア トランスポート コントロールを通じてシステムと通信します。The background task communicates with the system through the System Media Transport Controls.

次の図は、システムの設計概要を簡単に示しています。The following diagram is an overview of how the system is designed.

Windows 10 のバックグラウンド オーディオのアーキテクチャ

MediaPlayerMediaPlayer

Windows.Media.Playback 名前空間には、バックグラウンドでオーディオを再生するために使用する API が含まれています。The Windows.Media.Playback namespace contains APIs used to play audio in the background. 再生が発生するアプリごとに、単一の MediaPlayer インスタンスが存在します。There is a single instance of MediaPlayer per app through which playback occurs. バックグラウンド オーディオ アプリは、MediaPlayer クラスのメソッドを呼び出し、プロパティを設定することで、現在のトラックの設定、再生の開始、一時停止、早送り、巻き戻しなどのコマンドを行います。Your background audio app calls methods and sets properties on the MediaPlayer class to set the current track, start playback, pause, fast forward, rewind, and so on. MediaPlayer オブジェクトのインスタンスには、常に BackgroundMediaPlayer.Current プロパティを通じてアクセスします。The media player object instance is always accessed through the BackgroundMediaPlayer.Current property.

MediaPlayer プロキシとスタブMediaPlayer Proxy and Stub

アプリのバックグラウンド プロセスから BackgroundMediaPlayer.Current にアクセスすると、MediaPlayer インスタンスがバックグラウンド タスク ホストでアクティブ化され、直接操作できるようになります。When BackgroundMediaPlayer.Current is accessed from your app's background process, the MediaPlayer instance is activated in the background task host and can be manipulated directly.

フォアグラウンド アプリケーションから BackgroundMediaPlayer.Current にアクセスした場合に返される MediaPlayer インスタンスは、実際には、バックグラウンド プロセスでスタブと通信するプロキシです。When BackgroundMediaPlayer.Current is accessed from the foreground application, the MediaPlayer instance that is returned is actually a proxy that communicates with a stub in the background process. このスタブは、実際の MediaPlayer インスタンスとやり取りしますが、このインスタンスもバックグラウンド プロセスでホストされています。This stub communicates with the actual MediaPlayer instance, which is also hosted in the background process.

フォアグラウンドとバックグラウンドの両方のプロセスで、MediaPlayer インスタンスのほとんどのプロパティにアクセスできます。ただし、MediaPlayer.SourceMediaPlayer.SystemMediaTransportControls は例外で、これらはバックグラウンド プロセスからのみアクセスできます。Both the foreground and background process can access most of the properties of the MediaPlayer instance, with the exception of MediaPlayer.Source and MediaPlayer.SystemMediaTransportControls which can only be accessed from the background process. フォアグラウンド アプリとバックグラウンド プロセスはいずれも、MediaOpenedMediaEndedMediaFailed など、メディア固有のイベントに関する通知を受け取ることができます。The foreground app and the background process can both receive notifications of media-specific events like MediaOpened, MediaEnded, and MediaFailed.

プレイリストPlayback Lists

バックグラウンド オーディオ アプリケーションの一般的なシナリオでは、複数の項目が連続して再生されます。A common scenario for background audio applications is to play multiple items in a row. これをバックグラウンド プロセスで最も簡単に実行するには、MediaPlaybackList オブジェクトを使います。このオブジェクトは、MediaPlayer.Source プロパティに割り当てることで、MediaPlayer のソースとして設定できます。This is most easily accomplished in your background process by using a MediaPlaybackList object, which can be set as a source on the MediaPlayer by assigning it to the MediaPlayer.Source property.

バックグラウンド プロセスに設定された MediaPlaybackList にフォアグラウンド プロセスからアクセスすることはできません。It is not possible to access a MediaPlaybackList from the foreground process that was set in the background process.

システム メディア トランスポート コントロールSystem Media Transport Controls

ユーザーは、アプリの UI を直接使用しなくても、Bluetooth デバイス、SmartGlass、システム メディア トランスポート コントロールなどの手段で、オーディオの再生を制御できます。A user may control audio playback without directly using your app's UI through means such as Bluetooth devices, SmartGlass, and the System Media Transport Controls. バックグラウンド タスクでは、SystemMediaTransportControls クラスを使って、ユーザーが開始するこれらのシステム イベントの受信登録を行います。Your background task uses the SystemMediaTransportControls class to subscribe to these user-initiated system events.

バックグラウンド プロセスから SystemMediaTransportControls インスタンスを取得するには、MediaPlayer.SystemMediaTransportControls プロパティを使います。To get a SystemMediaTransportControls instance from within the background process, use the MediaPlayer.SystemMediaTransportControls property. フォアグラウンド アプリは、SystemMediaTransportControls.GetForCurrentView を呼び出すことでクラスのインスタンスを取得しますが、返されるインスタンスはフォアグラウンドのみのインスタンスであり、バックグラウンド タスクとは関係ありません。Foreground apps get an instance of the class by calling SystemMediaTransportControls.GetForCurrentView, but the instance returned is a foreground-only instance that does not relate to the background task.

タスク間のメッセージ送信Sending Messages Between Tasks

バックグラウンド オーディオ アプリの 2 つのプロセス間で通信することが必要になる場合があります。There are times when you will want to communicate between the two processes of a background audio app. たとえば、新しいトラックの再生が始まるときにバックグラウンド タスクからフォアグラウンド タスクに通知し、新しい曲のタイトルをフォアグラウンド タスクに送って画面に表示させることがあります。For example, you might want the background task to notify the foreground task when a new track starts playing, and then send the new song title to the foreground task to display on the screen.

単純な通信メカニズムにより、フォアグラウンド プロセスとバックグラウンド プロセスの両方でイベントを発生させることができます。A simple communication mechanism raises events in both the foreground and background processes. SendMessageToForeground メソッドと SendMessageToBackground メソッドは、それぞれ対応するプロセスでイベントを呼び出します。The SendMessageToForeground and SendMessageToBackground methods each invoke events in the corresponding process. MessageReceivedFromBackground イベントと MessageReceivedFromForeground イベントの受信登録を行うことで、メッセージを受信することができます。Messages can be received by subscribing to the MessageReceivedFromBackground and MessageReceivedFromForeground events.

データは引数としてメッセージ送信メソッドに渡され、次にメッセージ受信イベント ハンドラーに渡されます。Data can be passed as an argument to the send message methods that are then passed into the message received event handlers. データを渡すには、ValueSet クラスを使います。Pass data using the ValueSet class. このクラスは、文字列をキーとして格納し、その他の値の型を値として格納するディクショナリです。This class is a dictionary that contains a string as a key and other value types as values. 渡すことができるのは、整数型、文字列型、ブール型など、単純型の値です。You can pass simple value types such as integers, strings, and booleans.

バックグラウンド タスクの有効期間Background Task Life Cycle

バックグラウンド タスクの有効期間は、アプリの現在の再生状態に密接に関係します。The lifetime of a background task is closely tied to your app's current playback status. たとえば、ユーザーがオーディオ再生を一時停止すると、システムは状況に応じてアプリを終了させたり、取り消したりします。For example, when the user pauses audio playback, the system may terminate or cancel your app depending on the circumstances. オーディオが再生されることなく一定の時間が経過すると、システムが自動的にバックグラウンド タスクをシャットダウンします。After a period of time without audio playback, the system may automatically shut down the background task.

IBackgroundTask.Run メソッドが呼び出されるのは、初めてアプリがフォアグラウンド アプリで実行中のコードから BackgroundMediaPlayer.Current にアクセスしたときと、MessageReceivedFromBackground イベントに対するハンドラーを登録したときのうち、早い方です。The IBackgroundTask.Run method is called the first time your app accesses either BackgroundMediaPlayer.Current from code running in the foreground app or when you register a handler for the MessageReceivedFromBackground event, whichever occurs first. バックグラウンド プロセスから送信されたメッセージをフォアグラウンド アプリで逃すことのないよう、初めて BackgroundMediaPlayer.Current を呼び出す前にメッセージ受信ハンドラーに登録しておくことをお勧めします。It is recommended that you register for the message received handler before calling BackgroundMediaPlayer.Current for the first time so that the foreground app doesn't miss any messages sent from the background process.

バックグラウンド タスクを有効な状態に維持するために、アプリでは Run メソッドから BackgroundTaskDeferral を要求し、タスク インスタンスが Canceled イベントまたは Completed イベントを受け取るときに BackgroundTaskDeferral.Complete を呼び出す必要があります。To keep the background task alive, your app must request a BackgroundTaskDeferral from within the Run method and call BackgroundTaskDeferral.Complete when the task instance receives the Canceled or Completed events. Run メソッドではループ処理または待機を行わないでください。リソースが消費され、アプリのバックグラウンド タスクがシステムによって終了される原因になることがあります。Do not loop or wait in the Run method because this consumes resources and may cause your app's background task to be terminated by the system.

Run メソッドが完了し、遅延が要求されない場合、バックグラウンド タスクは Completed イベントを取得します。Your background task gets the Completed event when the Run method is completed and deferral is not requested. 場合によっては、アプリで Canceled イベントを取得したときに、その後に Completed イベントが続くことがあります。In some cases, when your app gets the Canceled event, it can be also followed by the Completed event. タスクでは、Run の実行中に Canceled イベントを受け取ることがあるため、このような同時実行の可能性に必ず対処してください。Your task may receive a Canceled event while Run is executing, so be sure to manage this potential concurrence.

バックグラウンド タスクが取り消される状況には、次のような場合があります。Situations in which the background task can be cancelled include:

  • 専用サブポリシーが適用されるシステムで、オーディオ再生機能を備えた新しいアプリが起動した場合。A new app with audio playback capabilities starts on systems that enforce the exclusivity sub-policy. 後の「バックグラウンド オーディオ タスクの有効期間に関するシステム ポリシー」をご覧ください。See the System policies for background audio task lifetime section below.

  • バックグラウンド タスクが起動したが、音楽はまだ再生されず、フォアグラウンド アプリが中断された場合。A background task has been launched but music is not yet playing, and then the foreground app is suspended.

  • 他のメディアの割り込み (着信通話や VoIP 通話など)。Other media interruptions, such as incoming phone calls or VoIP calls.

バックグラウンド タスクが予告なしに終了される状況には、次のような場合があります。Situations in which the background task can be terminated without notice include:

  • VoIP 通話の着信があるが、バックグラウンド タスクを存続させるための十分なメモリがシステムにない場合。A VoIP call comes in and there is not enough available memory on the system to keep the background task alive.

  • リソース ポリシーの違反が発生した場合。A resource policy is violated.

  • タスクの取り消しまたは完了が適切に終わらない場合。Task cancellation or completion does not end gracefully.

バックグラウンド オーディオ タスクの有効期間に関するシステム ポリシーSystem policies for background audio task lifetime

バックグラウンド オーディオ タスクの有効期間をシステムでどのように管理するかを決定するには、次のポリシーが役立ちます。The following policies help determine how the system manages the lifetime of background audio tasks.

Exclusivity (排他)Exclusivity

このサブポリシーが有効であれば、バックグラウンド オーディオ タスクの数が常に 1 件以内に制限されます。If enabled, this sub-policy limits the number of background audio tasks to be at most 1 at any given time. モバイルやその他の非デスクトップ SKU で有効に設定されます。It is enabled on Mobile and other non-Desktop SKUs.

無通信タイムアウトInactivity Timeout

リソースの制約により、システムは、非アクティブな状態が一定期間続いた後にバックグラウンド タスクを終了する可能性があります。Due to resource constraints, the system may terminate your background task after a period of inactivity.

バックグラウンド タスクは、以下の条件が満たされた場合に "非アクティブ" と見なされます。A background task is considered “inactive” if both of the following conditions are met:

  • フォアグラウンド アプリが表示されていない (中断または終了済み)。The foreground app is not visible (it is suspended or terminated).

  • バックグラウンドのメディア プレーヤーが再生中の状態ではない。The background media player is not in the playing state.

両方の条件が満たされている場合、バックグラウンド メディアのシステム ポリシーは、タイマーを開始します。If both of these conditions are satisfied, the background media system policy will start a timer. タイマーの有効期限が切れたときにどちらの条件にも変化がない場合、バックグラウンド メディアのシステム ポリシーによってバックグラウンド タスクが終了されます。If neither condition has changed when the timer expires, the background media system policy will terminate the background task.

Shared Lifetime (共有の有効期間)Shared Lifetime

このサブポリシーが有効であれば、バックグラウンド タスクがフォアグラウンド タスクの有効期間に依存するように強制されます。If enabled, this sub-policy forces the background task to be dependent on the lifetime of the foreground task. ユーザーまたはシステムによってフォアグラウンド タスクがシャットダウンされると、バックグラウンド タスクもシャットダウンされます。If the foreground task is shut down, either by the user or the system, the background task will also shut down.

ただし、フォアグラウンドはバックグラウンドに依存しません。However, note that this does not mean that the foreground is dependent on the background. バックグラウンド タスクがシャットダウンしても、これによってフォアグラウンド タスクがシャットダウンされるわけではありません。If the background task is shut down, this does not force the foreground task to shut down.

次の表は、デバイスの種類によって適用されるポリシーを示します。The following table lists the which policies are enforced on which device types.

サブポリシーSub-policy デスクトップDesktop モバイルMobile その他Other
Exclusivity (排他)Exclusivity 無効Disabled 有効Enabled 有効Enabled
無通信タイムアウトInactivity Timeout 無効Disabled 有効Enabled 無効Disabled
Shared Lifetime (共有の有効期間)Shared Lifetime 有効Enabled 無効Disabled 無効Disabled