情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 のバックグラウンド オーディオの概要

2014/06/18

対象: Windows Phone 8

バックグラウンドでオーディオを再生する Windows Phone 用のアプリを作成することができます。つまり、ユーザーが [戻る] ボタンまたは [スタート] ボタンを押してアプリケーションから離れても、アプリケーションでオーディオを再生し続けることができます。この記事では、バックグラウンド オーディオ アプリケーションの構成要素と、それらの連携のしくみについて説明します。

このトピックは、次のセクションで構成されています。

バックグラウンド オーディオ アプリケーションでは、Windows Phone OS 7.1 の新機能であるバックグラウンド エージェントを利用します。バックグラウンド エージェントの詳細については、「Windows Phone 8 のマルチタスク」を参照してください。

Windows Phone のすべてのメディアは、Zune Media Queue を介して再生されます。バックグラウンド オーディオ アプリケーションは、Zune Media Queue に対して、現在のトラックの設定、再生の開始、一時停止、早送り、巻き戻しなどのコマンドを送信します。そのためには、BackgroundAudioPlayer クラスのメソッドを呼び出します。次に、Instance オブジェクトが Zune Media Queue とやり取りすることによってオーディオの再生を操作します。

Universal Volume Control (UVC) は、オーディオの再生中またはユーザーが音量コントロール スイッチを押したときにロック画面に表示されるコントロールのセットです。UVC は Zune Media Queue も操作します。したがって、アプリケーションから何らかの再生を開始した場合、それ以降、UVC を使用してオーディオを制御できます。UVC はアプリケーション内の AudioPlayerAgent にイベントを送信し、プレイリスト ロジックを実装できるようにします。このトピックで後ほど、AudioPlayerAgent について詳細に説明します。

バックグラウンド オーディオ アプリをロック画面の下で実行するための特別な設定は必要ありません。

次の 2 種類のバックグラウンド オーディオ アプリケーションがあります。1 つの種類は、単純なプレイリストを実装し、メディア ファイルのアドレスを含む Uri を Zune Media Queue に渡して現在のトラックを設定するものです。この Uri には、電話のローカル アドレスまたはリモート アドレスを指定できます。いずれの場合も、オーディオは Windows Phone での再生がサポートされている種類である必要があります。有効なオーディオ ファイルの種類については、「Windows Phone 8 でサポートされるメディア コーデック」を参照してください。

もう 1 つの種類のバックグラウンド オーディオ アプリケーションでは、MediaStreamSource を使用して、再生システムにオーディオ サンプルをフィードするオーディオ ストリームを実装します。オーディオのストリーミングとデコードを処理する MediaStreamSource から派生したクラスを実装するので、このストリームには任意の形式を使用できます。MediaStreamSource の実装については、この記事では説明しません。

この 2 種類のアプリケーションには共通する要素がいくつかあります。まず、プレイリストを実装するアプリケーションについて説明します。次に、MediaStreamSource (MSS) を使用してストリーミングを実装するアプリケーションについて説明します。

プレイリスト アプリケーション

バックグラウンド オーディオ プレイリスト アプリケーションを作成するには、2 つの要素を実装する必要があります。再生を制御するユーザー インターフェイスを提供するアプリケーションと、AudioPlayerAgent から派生したクラスを実装するアセンブリです。実装する必要があるこの 2 つの要素は、次の図で緑色で示されています。

Background audio playlist app architecture

アプリケーション UI

アプリケーション ユーザー インターフェイスは、アプリケーションのユーザー インターフェイスを実装する場所です。Visual Studio のテンプレートを使用してアプリケーションを作成する場合、これは MainPage.xaml ファイルと MainPage.xaml.cs ファイルになります。メイン アプリケーションでは、Instance を使用して、Zune Media Queue での現在のトラックの設定、再生の開始などの操作を行います。

AudioPlayerAgent

AudioPlayerAgent は、アプリケーションのユーザー インターフェイスまたは UVC を通じてユーザーによって要求されたアクションを処理するために、オペレーティング システムによってインスタンス化されます。

AudioPlayerAgent はバックグラウンドで実行され、BackgroundAudioPlayer のインスタンスを呼び出します。このインスタンスが Zune Media Queue を呼び出して、実際にオーディオを再生します。

エージェントが OnUserAction(BackgroundAudioPlayer, AudioTrack, UserAction, Object)OnPlayStateChanged(BackgroundAudioPlayer, AudioTrack, PlayState)、または OnError(BackgroundAudioPlayer, AudioTrack, Exception, Boolean) の処理を終了させた後、NotifyComplete() を呼び出して、処理が終了し、メモリから安全にエージェントを削除できることをオペレーティング システムに通知します。

Visual Studio の [Windows Phone オーディオ再生エージェント] テンプレートを使用して、新しい AudioPlayerAgent プロジェクトを作成し、ソリューションに追加します。

Background audio playback agent template

次に、メイン アプリケーション プロジェクトから新しい AudioPlayerAgent への参照を追加します。

BackgroundAudioSolution

アプリケーション プロジェクトの [参照] ノードを右クリックし、[参照の追加] を選択します。

ストリーミング オーディオ アプリケーション

ストリーミング オーディオ アプリケーションを作成するには、プレイリスト アプリケーションと同じ要素を実装する必要があります。具体的には、ユーザー インターフェイスを提供するメイン アプリケーションと、AudioPlayerAgent を作成する必要があります。ストリーミング オーディオ アプリケーションの場合、AudioStreamingAgent の派生クラスと MediaStreamSource の派生クラスも実装する必要があります。実装する必要がある要素は、次の図で緑色で示されています。

Background audio streaming app architecture

オーディオ ストリーミング エージェント

AudioStreamingAgentMediaStreamSource を作成し、Zune Media Queue で指定する処理を行います。そのために、OnBeginStreaming(AudioTrack, AudioStreamer) メソッドに渡される AudioStreamer インスタンスで SetSource(MediaStreamSource) を呼び出します。

Visual Studio の [Windows Phone オーディオ ストリーミング エージェント] テンプレートを使用して、新しい AudioStreamingAgent プロジェクトを作成し、ソリューションに追加します。

Background audio streaming agent template

MediaStreamSource

Zune Media Queue は MediaStreamSource を呼び出してオーディオ サンプルを要求します。MediaStreamSource の作成については、このトピックでは説明しません。詳細については、「MediaStreamSource のサンプル」を参照してください。

バックグラウンド エージェントのライフサイクル

AudioPlayerAgent は、アプリケーションのユーザー インターフェイスまたは UVC からの UserAction 要求を処理する必要があるときに、BackgroundAudioPlayer によって作成されます。

AudioStreamingAgent は、新しいストリームが必要なときに、BackgroundAudioPlayer によって作成されます。エージェントが作成された後、BackgroundAudioPlayerAudioStreamingAgentOnBeginStreaming(AudioTrack, AudioStreamer) メソッドを呼び出します。

バックグラウンド エージェントは、Abort() または NotifyComplete() が呼び出されたときに破棄されます。

その他のバックグラウンド オーディオ クラス

バックラウンド オーディオ アプリケーションでは、オーディオ プレーヤーのエクスペリエンスを実装するために他のクラスも使用します。

BackgroundAudioPlayer

BackgroundAudioPlayer クラスは、Zune Media Queue とのやり取りを処理します。Instance のメソッドを呼び出すと、デバイスでのオーディオ再生に影響します。

AudioTrack

AudioTrack クラスは、タイトル、アーティスト、アルバム、トラックの URI など、トラックに関するメタデータを表します。URI が null に設定されている場合、システムではトラックを MediaStreamSource に設定していると見なされます。この場合、Tag プロパティを使用して、AudioPlayerAgent から AudioStreamingAgent に情報を渡すことができます。

AudioStreamer

AudioStreamer のインスタンスは OnBeginStreaming(AudioTrack, AudioStreamer) に渡されます。OnBeginStreaming の実装で、SetSource(MediaStreamSource) を呼び出して MediaStreamSource の派生クラスを指定し、これによってオーディオ サンプルを提供します。

このセクションでは、バックグラウンド オーディオを再生するアプリケーションを作成するときに実装することをお勧めするベスト プラクティスを説明します。

デバッグ

コーディング、デバッグ、コードの編集、およびデバッグ再開の処理中、デバッガーは、デバッグの再開時にアプリケーションではなくバックグラウンド オーディオ エージェントにデバッガー自体をアタッチする場合があります。これを避けるには、アプリケーションの起動時にバックグラウンド エージェントが終了していることを確認する必要があります。これを行う便利な方法としては、App クラスのコンストラクターに Close() の呼び出しを配置します。Visual Studio のテンプレートからアプリを作成した場合は、デバッガーで実行されているかどうかを確認するために、App クラスのコンストラクターでチェックが行われます。この if ステートメントの内部に、BackgroundAudioPlayer.Instance.Close の呼び出しを配置します。

// Show graphics profiling information while debugging.
if (System.Diagnostics.Debugger.IsAttached)
{
    // Close the background audio player in case it 
    // was running from a previous debugging session.
    BackgroundAudioPlayer.Instance.Close();

    // ...

ユーザー操作の処理

BackgroundAudioPlayer では、UserAction 要求の数に制限は課されません。UI を通じて起動された操作は、それがアプリからであっても Universal Volume Control (UVC) からであっても、キューに入れられて 1 つずつ処理されます。AudioPlayerAgent には、後続の呼び出しがあるかどうかを判断する手段はありません。ネットワーク要求を必要とする SkipNextSkipPrevious、または Play の呼び出しは、数秒かかる場合があります。

ユーザー操作との関係は、次のとおりです。

  1. SkipNextSkipPrevious、または Play への連続した呼び出しは、処理時間の長さに関係なく順番に処理されます。

  2. それぞれの呼び出しは、30 秒まで許されます。

  3. Play 操作と Pause 操作が優先されることはないため、ユーザー操作に反応するまでにエージェントが数秒 (数分になることも) を要することもあります。これは、PlayPause に対してすぐに反応があるという、期待されたユーザー エクスペリエンスに反します。

キューイングされる SkipNext要求と SkipPrevious 要求の数を制限し、PlayPause に高い優先順位を与えてください。バックグラウンド オーディオ プレーヤーのサンプルでは、単に要求の処理が終わるまで [next] ボタンと [prev] ボタンを無効化しています。

状態遷移の処理

BackgroundAudioPlayer の状態が変化した場合には、PlayStateChangedEventArgs から状態遷移に関する情報を取得することができます。CurrentPlayState と、オーディオ プレーヤーが現在の再生状態になる前に発生した IntermediatePlayState の両方を特定できます。

以下に、イベント引数で提供される情報を使って処理できる状態遷移の例を示します。

  1. IntermediatePlayState = BufferingStopped

  2. CurrentPlayState = Playing

  1. IntermediatePlayState = TrackEnded

  2. CurrentPlayState = Stopped

MediaElement と BackgroundAudioPlayer

オーディオ再生で BackgroundAudioPlayerMediaElement を混在させる場合は、注意が必要です。

  1. MediaElement 再生に切り替える前に Close() を呼び出す必要があります。

  2. メディア キューは 1 つしかありません。アプリケーションでバックグラウンド オーディオを一時停止にし、MediaElement で何かを再生してから、バックグラウンドのオーディオ ストリームを再開することはできません。

メモリとランタイムの制約

  • AudioPlayerAgent の実装は、30 秒以内に NotifyComplete() または Abort() を呼び出す必要があります。

  • AudioStreamingAgent の実装では、無制限のランタイムが許可されます。

  • どちらの種類のバックグラウンド オーディオ エージェントも同じプロセスでホストされ、以下の最大メモリ制限を共有します。

    • Windows Phone 8 Update 3 のある Windows Phone 8 では 25 MB (つまり、8.0.10492 以降のバージョンの場合)。

    • Windows Phone 8 Update 3 のない Windows Phone 8 では 20 MB (つまり、8.0.10492 未満のバージョンの場合)。

    • Windows Phone OS 7.1 では 15 MB。

  • デバッガーでの実行時には、メモリとランタイムの制約は Windows Phone オペレーティング システムによって無視されます。

表示: