バックグラウンドでのメディアの再生Play media in the background

この記事では、アプリをフォアグラウンドからバックグラウンドに移動してもメディアの再生を続行できるように、アプリを構成する方法について説明します。This article shows you how to configure your app so that media continues to play when your app moves from the foreground to the background. バックグラウンドでの再生とは、ユーザーがアプリを最小化してホーム画面に戻った後や、それ以外の方法でアプリから離れた後も、アプリでオーディオの再生を続行できることを意味します。This means that even after the user has minimized your app, returned to the home screen, or has navigated away from your app in some other way, your app can continue to play audio.

バックグラウンド オーディオ再生のシナリオには次のものがあります。Scenarios for background audio playback include:

  • 長時間にわたって実行されるプレイリスト: ユーザーは、フォアグラウンド アプリを一時的に表示し、プレイリストを選んで再生を開始します。その後、プレイリストはバックグラウンドで再生を続行します。Long-running playlists: The user briefly brings up a foreground app to select and start a playlist, after which the user expects the playlist to continue playing in the background.

  • タスク スイッチャーの使用: ユーザーは、オーディオの再生を開始するためにフォアグラウンド アプリを一時的に表示した後、タスク スイッチャーを使って別の開いているアプリに切り替えます。Using task switcher: The user briefly brings up a foreground app to start playing audio, then switches to another open app using the task switcher. ユーザーは、バックグラウンドでオーディオの再生が継続することを期待します。The user expects the audio to continue playing in the background.

この記事で説明されているバックグラウンド オーディオの実装を使うと、モバイル、デスクトップ、Xbox を含むすべての Windows デバイスで、アプリをユニバーサルに実行できます。The background audio implementation described in this article will allow your app to run universally on all Windows devices including Mobile, Desktop, and Xbox.

注意

この記事のコードは、UWP のバックグラウンド オーディオのサンプルを基にしています。The code in this article was adapted from the UWP Background Audio sample.

1 プロセス モデルの説明Explanation of one-process model

Windows 10 バージョン 1607 では、新しいシングル プロセス モデルが導入され、バックグラウンド オーディオを実現するプロセスが大幅に簡略化されました。With Windows 10, version 1607, a new single-process model has been introduced that greatly simplifies the process of enabling background audio. 以前は、アプリで、フォアグラウンド アプリに加えてバックグラウンド プロセスも管理し、2 つのプロセス間の状態変更を手動で通信する必要がありました。Previously, your app was required to manage a background process in addition to your foreground app and then manually communicate state changes between the two processes. 新しいモデルでは、アプリ マニフェストにバックグラウンド オーディオ機能を追加するだけで、アプリはバックグラウンドに移行しても、自動的にオーディオ再生を続行します。Under the new model, you simply add the background audio capability to your app manifest, and your app will automatically continue playing audio when it moves to the background. 2 つ新しいアプリケーション ライフサイクル イベント、EnteredBackgroundLeavingBackground によって、バックグラウンドへの移行とバックグラウンドからの移行をアプリに通知できます。Two new application lifecycle events, EnteredBackground and LeavingBackground let your app know when it is entering and leaving the background. アプリがバックグラウンドに遷移またはバックグラウンドから遷移する場合、システムによって適用されるメモリの制約が変化する場合があるため、これらのイベントを使用して現在のメモリ消費量を確認し、制限値を下回るようにリソースを解放できます。When your app moves into the transitions to or from the background, the memory constraints enforced by the system may change, so you can use these events to check your current memory consumption and free up resources in order to stay below the limit.

複雑なプロセス間通信と状態の管理を排除することによって、新しいモデルでは、コードを大幅に削減し、より簡単にバックグラウンド オーディオを実装することができます。By eliminating the complex cross-process communication and state management, the new model allows you to implement background audio much more quickly with a significant reduction in code. ただし、下位互換性のために、現在のリリースでは 2 プロセス モデルも引き続きサポートされています。However, the two-process model is still supported in the current release for backwards compatibility. 詳しくは、「従来のバックグラウンド オーディオ モデル」をご覧ください。For more information, see Legacy background audio model.

バックグラウンド オーディオの要件Requirements for background audio

アプリは、アプリがバックグラウンドで実行されている場合のオーディオ再生について、以下の要件を満たしている必要があります。Your app must meet the following requirements for audio playback while your app is in the background.

  • アプリ マニフェストにバックグラウンド メディア再生機能を追加します。その方法については、後で説明します。Add the Background Media Playback capability to your app manifest, as described later in this article.
  • アプリで、MediaPlayer のシステム メディア トランスポート コントロール (SMTC) との自動統合を無効にしている場合 (CommandManager.IsEnabled プロパティを false に設定するなど)、バックグラウンド メディア再生を有効にするために、SMTC との手動統合を実装する必要があります。If your app disables the automatic integration of MediaPlayer with the System Media Transport Controls (SMTC), such as by setting the CommandManager.IsEnabled property to false, then you must implement manual integration with the SMTC in order to enable background media playback. MediaPlayer 以外の API (AudioGraph など) を使用してオーディオを再生している場合も、アプリがバックグラウンドに移動したときにオーディオを再生し続けるには、手動で SMTC と統合する必要があります。You must also manually integrate with SMTC if you are using an API other than MediaPlayer, such as AudioGraph, to play audio if you want to have the audio continue to play when your app moves to the background. SMTC 統合の最小要件については、「システム メディア トランスポート コントロールの手動制御」の「バックグラウンド オーディオに対してシステム メディア トランスポート コントロールを使う」セクションをご覧ください。The minimum SMTC integration requirements are described in the "Use the system media transport controls for background audio" section of Manual control of the System Media Transport Controls.
  • アプリがバックグラウンドにある場合、システムによって設定されたバックグラウンド アプリのメモリ使用量の制限を維持する必要があります。While your app is in the background, you must stay under the memory usage limits set by the system for background apps. バックグラウンドでのメモリ管理のガイダンスについては、後で示します。Guidance for managing memory while in the background is provided later in this article.

バックグラウンド メディア再生のマニフェストの機能Background media playback manifest capability

バックグラウンド オーディオを有効には、バックグラウンド メディア再生機能をアプリ マニフェスト ファイル (Package.appxmanifest) に追加する必要があります。To enable background audio, you must add the background media playback capability to the app manifest file, Package.appxmanifest.

マニフェスト デザイナーを使って、アプリ マニフェストに機能を追加するにはTo add capabilities to the app manifest using the manifest designer

  1. Microsoft Visual Studio では、ソリューション エクスプローラーpackage.appxmanifest 項目をダブルクリックし、アプリケーション マニフェストのデザイナーを開きます。In Microsoft Visual Studio, in Solution Explorer, open the designer for the application manifest by double-clicking the package.appxmanifest item.
  2. [機能] タブをクリックします。Select the Capabilities tab.
  3. [バックグラウンド メディア再生] チェック ボックスをオンにします。Select the Background Media Playback check box.

アプリ マニフェスト xml を手動で編集して機能を設定するには、最初に uap3 名前空間プレフィックスが Package 要素で定義されていることを確認します。To set the capability by manually editing the app manifest xml, first make sure that the uap3 namespace prefix is defined in the Package element. 定義されていない場合は、次に示すように追加します。If not, add it as shown below.

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">

次に、backgroundMediaPlayback 機能を Capabilities 要素に追加します。Next, add the backgroundMediaPlayback capability to the Capabilities element:

<Capabilities>
    <uap3:Capability Name="backgroundMediaPlayback"/>
</Capabilities>

フォアグラウンドとバックグラウンドの間の移行の処理Handle transitioning between foreground and background

アプリがフォアグラウンドからバックグラウンドに移動すると、EnteredBackground イベントが発生します。When your app moves from the foreground to the background, the EnteredBackground event is raised. また、アプリがフォアグラウンドに戻るときには、LeavingBackground イベントが発生します。And when your app returns to the foreground, the LeavingBackground event is raised. これらは、アプリのライフサイクル イベントであるために、アプリを作成するときに、これらのイベントのハンドラーを登録する必要があります。Because these are app lifecycle events, you should register handlers for these events when your app is created. 既定のプロジェクト テンプレートでは、これは、App.xaml.cs の App クラス コンストラクターに追加することを意味します。In the default project template, this means adding it to the App class constructor in App.xaml.cs.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    this.EnteredBackground += App_EnteredBackground;
    this.LeavingBackground += App_LeavingBackground;
}

バックグラウンドで現在実行しているかどうかを追跡する変数を作成します。Create a variable to track whether you are currently running in the background.

bool _isInBackgroundMode = false;

EnteredBackground イベントが発生したときに、現在バックグラウンドで実行していることを示す追跡変数を設定します。When the EnteredBackground event is raised, set the tracking variable to indicate that you are currently running in the background. EnteredBackground イベントで長時間のタスクは実行しないでください。ユーザーに対して、バックグラウンドへの移行が遅いように見える可能性があります。You should not perform long-running tasks in the EnteredBackground event because this may cause the transition to the background to appear slow to the user.

private void App_EnteredBackground(object sender, EnteredBackgroundEventArgs e)
{
    _isInBackgroundMode = true;
}

LeavingBackground イベント ハンドラーで、アプリがバックグラウンドで実行されなくなったことを示すために追跡変数を設定する必要があります。In the LeavingBackground event handler, you should set the tracking variable to indicate that your app is no longer running in the background.

private void App_LeavingBackground(object sender, LeavingBackgroundEventArgs e)
{
    _isInBackgroundMode = false;
}

メモリ管理の要件Memory management requirements

フォアグラウンドとバックグラウンドの間の移行処理で最も重要な部分は、アプリが使うメモリの管理です。The most important part of handling the transition between foreground and background is managing the memory that your app uses. バックグラウンドで実行すると、システムによってアプリが保持することを許可されているメモリ リソースが減少するため、AppMemoryUsageIncreasedAppMemoryUsageLimitChanging イベントについても登録する必要があります。Because running in the background will reduce the memory resources your app is allowed to retain by the system, you should also register for the AppMemoryUsageIncreased and AppMemoryUsageLimitChanging events. これらのイベントが発生したとき、アプリの現在のメモリ使用量と、現在の制限を確認し、必要に応じて、メモリ使用量を減らしてください。When these events are raised, you should check your app's current memory usage and the current limit, and then reduce your memory usage if needed. バックグラウンドで実行中にメモリ使用量を減らす方法については、アプリがバックグラウンドに移動したときにメモリを解放する方法に関するページをご覧ください。For information about reducing your memory usage while running in the background, see Free memory when your app moves to the background.

バックグラウンド メディア アプリのネットワークの可用性Network availability for background media apps

すべてのネットワーク対応メディア ソース (ストリームやファイルから作成されないソース) は、リモート コンテンツの取得中はアクティブなネットワーク接続を維持し、リモート コンテンツを取得していないときはネットワーク接続を解放します。All network aware media sources, those that are not created from a stream or a file, will keep the network connection active while retrieving remote content, and they release it when they are not. MediaStreamSource は、具体的には、アプリケーションを利用して、SetBufferedRange を使用して適切にバッファー処理された範囲をプラットフォームに適切に報告します。MediaStreamSource, specifically, relies on the application to correctly report the correct buffered range to the platform using SetBufferedRange. コンテンツ全体が完全にバッファー処理されると、ネットワークはアプリ用に予約されなくなります。After the entire content is fully buffered, the network will no longer be reserved on the app’s behalf.

メディアをダウンロードしていないときに、バックグラウンドでネットワーク呼び出しを行う必要がある場合は、MaintenanceTriggerTimeTrigger などの適切なタスクでこれらの呼び出しをラップする必要があります。If you need to make network calls that occur in the background when media is not downloading, these must be wrapped in an appropriate task like MaintenanceTrigger or TimeTrigger. 詳しくは、「バックグラウンド タスクによるアプリのサポート」をご覧ください。For more information, see Support your app with background tasks.