次の方法で共有


バックグラウンドでメディアを再生する

この記事では、アプリがフォアグラウンドからバックグラウンドに移動したときにメディアが引き続き再生されるようにアプリを構成する方法について説明します。 つまり、ユーザーがアプリを最小化した後、ホーム画面に戻った後、または何らかの方法でアプリから移動した後でも、アプリは引き続きオーディオを再生できます。

バックグラウンド オーディオ再生のシナリオは次のとおりです。

  • 実行時間の長いプレイリスト: ユーザーは一時的にフォアグラウンド アプリを起動してプレイリストを選択して開始します。その後、ユーザーは再生リストがバックグラウンドで再生を続ける必要があります。

  • タスク スイッチャーの使用: ユーザーは一時的にフォアグラウンド アプリを起動してオーディオの再生を開始し、タスク スイッチャーを使用して別の開いているアプリに切り替えます。 ユーザーは、オーディオがバックグラウンドで再生し続ける必要があります。

この記事で説明するバックグラウンド オーディオ実装を使用すると、モバイル、デスクトップ、Xbox を含むすべての Windows デバイスでアプリをユニバーサルに実行できます。

この記事のコードは、UWP バックグラウンド オーディオサンプルから調整されています。

1 プロセス モデルの説明

Windows 10 バージョン 1607 では、バックグラウンド オーディオを有効にするプロセスを大幅に簡略化する新しい単一プロセス モデルが導入されました。 以前は、フォアグラウンド アプリに加えてバックグラウンド プロセスを管理し、2 つのプロセス間で状態の変化を手動で伝える必要があった。 新しいモデルでは、アプリ マニフェストにバックグラウンド オーディオ機能を追加するだけで、アプリはバックグラウンドに移動したときに自動的にオーディオの再生を続けます。 2 つの新しいアプリケーションライフサイクルイベント、EnteredBackgroundLeavingBackground により、アプリはバックグラウンドに入る際と出る際に通知を受けます。 アプリがバックグラウンドとの間の遷移に移行すると、システムによって適用されるメモリ制約が変更される可能性があるため、これらのイベントを使用して現在のメモリ消費量を確認し、リソースを解放して制限を下回ることができます。

複雑なクロスプロセス通信と状態管理を排除することで、新しいモデルを使用すると、バックグラウンド オーディオをより迅速に実装でき、コードが大幅に削減されます。 ただし、下位互換性のために、現在のリリースでは 2 プロセス モデルが引き続きサポートされています。 詳細については、「従来のバックグラウンド オーディオ モデル」を参照してください。

バックグラウンド オーディオの要件

アプリがバックグラウンドで実行されている間、アプリはオーディオ再生に関する次の要件を満たしている必要があります。

  • この記事で後述するように、 バックグラウンド メディア再生 機能をアプリ マニフェストに追加します。
  • アプリで MediaPlayer と System Media Transport Controls (SMTC) の自動統合が無効になっている場合 ( CommandManager.IsEnabled プロパティを false に設定するなど)、バックグラウンド メディアの再生を有効にするには、SMTC との手動統合を実装する必要があります。 また、 MediaPlayer 以外の API ( AudioGraph など) を使用している場合は、SMTC と手動で統合して、アプリがバックグラウンドに移動したときにオーディオを再生し続ける必要がある場合は、オーディオを再生する必要があります。 SMTC 統合の最小要件については、「システム メディア トランスポート コントロールの手動制御」の「バックグラウンド オーディオにシステム メディア トランスポート コントロールを使用する」セクションで説明されています。
  • アプリがバックグラウンドにある間は、バックグラウンド アプリのシステムによって設定されたメモリ使用量の制限に従う必要があります。 バックグラウンドでメモリを管理するためのガイダンスについては、この記事の後半で説明します。

メディアのバックグラウンド再生に対応するマニフェスト機能

バックグラウンド オーディオを有効にするには、バックグラウンド メディア再生機能をアプリ マニフェスト ファイル Package.appxmanifest に追加する必要があります。

マニフェスト デザイナーを使用してアプリ マニフェストに機能を追加するには

  1. Microsoft Visual Studio の ソリューション エクスプローラーで、package.appxmanifest 項目をダブルクリックして、アプリケーション マニフェストのデザイナーを開きます。
  2. 機能タブ を選択します。
  3. [ バックグラウンド メディア再生 ] チェック ボックスをオンにします。

アプリ マニフェスト xml を手動で編集して機能を設定するには、まず 、uap3 名前空間プレフィックスが Package 要素で定義されていることを確認します。 そうでない場合は、次のように追加します。

<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 要素に追加します。

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

前景と背景の間の遷移を処理する

アプリがフォアグラウンドからバックグラウンドに移動すると、EnteredBackground イベントが発生します。 アプリがフォアグラウンドに戻ると、LeavingBackground イベントが発生します。 これらはアプリ ライフサイクル イベントであるため、アプリの作成時にこれらのイベントのハンドラーを登録する必要があります。 既定のプロジェクト テンプレートでは、App.xaml.csの App クラス コンストラクターに追加することを意味します。

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

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

現在バックグラウンドで実行されているかどうかを追跡する変数を作成します。

bool _isInBackgroundMode = false;

EnteredBackground イベントが発生したら、追跡変数を設定して、現在バックグラウンドで実行していることを示します。 EnteredBackground イベントでは実行時間の長いタスクを実行しないでください。これにより、バックグラウンドへの切り替えがユーザーに遅く表示される可能性があるためです。

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

LeavingBackground イベント ハンドラーでは、アプリがバックグラウンドで実行されなくなったことを示す追跡変数を設定する必要があります。

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

メモリ管理の要件

フォアグラウンドとバックグラウンドの切り替えを処理する最も重要な部分は、アプリが使用するメモリの管理です。 バックグラウンドで実行すると、アプリがシステムによって保持できるメモリ リソースが減るため、 AppMemoryUsageIncreased イベントと AppMemoryUsageLimitChanging イベントにも登録する必要があります。 これらのイベントが発生したら、アプリの現在のメモリ使用量と現在の制限を確認し、必要に応じてメモリ使用量を減らす必要があります。 バックグラウンドでの実行中のメモリ使用量を減らす方法については、「アプリがバックグラウンドに 移動したときにメモリを解放する」を参照してください。

バックグラウンド メディア アプリのネットワーク可用性

ストリームまたはファイルから作成されていないすべてのネットワーク対応メディア ソースは、リモート コンテンツの取得中にネットワーク接続をアクティブな状態に保ち、それ以外の場合は解放します。 MediaStreamSource、具体的には、SetBufferedRangeを使用して、適切なバッファー範囲をプラットフォームに正しく報告 アプリケーションに依存します。 コンテンツ全体が完全にバッファーされると、ネットワークはアプリの代わりに予約されなくなります。

メディアがダウンロードされていないときにバックグラウンドで発生するネットワーク呼び出しを行う必要がある場合は、 MaintenanceTriggerTimeTrigger などの適切なタスクにラップする必要があります。 詳細については、「 バックグラウンド タスクを使用したアプリのサポート」を参照してください