ドルビーの統合に関するガイドライン
この統合ガイドラインでは、ドルビーオーディオ対応コンテンツに対応したアプリ開発について取り上げます。
Amazon Fire TVでドルビー設定を確認するには、[設定] > [ディスプレイとサウンド] > [オーディオ] > [Dolby Digital出力] を選択します。
- 用語
- ドルビーオーディオを再生する4つの方法
- 1. ExoPlayerを使用する方法
- 2. カスタムメディアプレーヤーを使用する方法
- 3. サポートされているほかのメディアプレーヤーを使用する方法
- 4. Android MediaPlayerを使用する方法
- ドルビー非対応のエンドポイントとプライベートリスニングモードの処理
用語
このドキュメントでは次の略語を使用します。
- EAC3: ドルビーデジタルプラス(DDP)
- AC3: ドルビーデジタル(DD)
ドルビーオーディオを再生する4つの方法
アプリでドルビー(DD、DDP、アトモス)オーディオ対応コンテンツを再生する方法は、次の4とおりです。
1. ExoPlayerを使用する方法
ExoPlayerは、Googleがサポートしているオープンソースのプレーヤーで、ドルビーオーディオストリームの再生に対応しています。
さまざまなAmazonデバイスでドルビーオーディオ対応コンテンツを再生させ、再生の質を向上させるために、AmazonではExoPlayer用に複数のパッチを開発しています。これらのパッチは、オープンソースのexoplayer-amazon-portとして提供されています(「amazon/rx.y.z」の各ブランチがExoPlayerバージョンx.y.zに対応します)。
2. カスタムメディアプレーヤーを使用する方法
AudioManager API、AudioTrack API、MediaCodec APIを使用するカスタムプレーヤーを実装します。このセクションでは、AudioManager API、AudioTrack API、MediaCodec APIを使用してドルビーオーディオ対応コンテンツを再生する方法を説明します。これはAndroid推奨のアプローチです。
ドルビーサポートの検出
Android Lでは、シンクの機能を通知できるように、AudioManagerのACTION_HDMI_AUDIO_PLUGインテントが拡張されました。このインテントは、HDMIがデバイスに接続されたときやデバイスから切断されたときに常にブロードキャストされます。
また、このインテント内のEXTRA_ENCODINGSを通じて、接続先エンドポイント(AVRまたはTV)の機能をアプリが検出できるようになっています。使用できる値は、ENCODING_XXXXという値です。例:
- ENCODING_PCM_16BIT
- ENCODING_AC3
- ENCODING_E_AC3
- ENCODING_E_AC3_JOC(APIレベル28で追加)
Android Lにはアトモス(ENCODING_E_AC3_JOC)検出用の列挙型はありませんが、Amazonでは別のメカニズムを用意しています。「hdmi_encodings」を問い合わせることにより、EXTRA_ENCODINGSと同様の方法で情報を検出することができます。
AudioManager.getParameters("hdmi_encodings")
たとえば、シンクがアトモスをサポートしている場合、次のような文字列が返されます。
"pcm;ac3;eac3;atmos;" //fireOS6
"pcm|ac3|eac3|atmos| //fireOS7
注: 一部のプラットフォームでは、シンクがドルビー対応コンテンツのデコードをサポートしていない場合でも、ドルビーサポートを示すことがあります。この場合、該当するプラットフォームは、ドルビーでエンコードされたコンテンツをシンクでサポートされる機能にトランスコードします。たとえば、シンクがPCMオーディオのみをサポートしている場合、受信されたドルビーオーディオストリームは、Fire TVデバイスによってPCMにトランスコードされます。
Fire TV Edition(日本未対応)TVプラットフォームおよびサウンドバーでは、(HDMIシンク経由ではなく)内蔵スピーカーを使用してオーディオを出力するため、前述のACTION_HDMI_AUDIO_PLUG
ブロードキャストアクションはありません。
この場合、アプリはグローバル設定external_surround_sound_enabled
を問い合わせることで、デバイスがドルビーデコードをサポートしているかどうかを確認します。
if (Settings.Global.getInt(mContext.getContentResolver(), "external_surround_sound_enabled") == 1) {
// プラットフォームはドルビーをサポートしています
} else {
// プラットフォームはドルビーをサポートしていません
}
戻り値が1の場合は、サポートされていることを意味します。
ドルビーがサポートされている場合は、パススルー再生の使用をお勧めします。たとえば、MediaCodecを使用する場合は、「OMX.google.raw.dec」デコーダーを使用してください。
詳細については、このExoPlayerパッチ(Added support for Surround Sound detection for Optical out)を参照してください。
Android APIレベル23では、シンク機能の問い合わせも可能なAPI getEncodingsが追加されています。
AudioManager audio = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
AudioDeviceInfo[] devices = audio.getDevices(audio.GET_DEVICES_OUTPUTS);
for (AudioDeviceInfo device : devices) {
Log.i(TAG, "サポート対象のエンコード" + Arrays.toString(device.getEncodings()));
}
アプリに通知される機能は、Amazonデバイスのオーディオ設定の影響を受ける場合があります。たとえば、ドルビーが無効になっている場合、デバイスはドルビーのサポートを通知しません。このような場合、適切なAVRに接続するとマルチチャネルPCMが有効になります。
AudioTrackの概要
Android Lでは、AudioFormatでENCODING_AC3とENCODING_E_AC3のエンコード形式がサポートされるようになりました。Android Pでは、アトモスに使用されるENCODING_E_AC3_JOCがサポートされるようになりました。AudioTrackがドルビーエンコード形式で構成され、接続先のエンドポイントもその形式をサポートしている場合、AudioTrackはドルビーのRAWビットストリームを入力として受け取ります。そのビットストリームは、IEC61937に従ってパケット化され、エンドポイントに伝送されます。AudioTrackは、暗号化されていない入力ビットストリームのみサポートします。
また、接続先のエンドポイントがこのエンコード形式をサポートしていなければ、AudioTrackの作成はできません。
一部のプラットフォームでは、接続先のエンドポイントがDDのみをサポートしている場合、DDPビットストリームがDDにトランスコードされます。
MediaCodecの概要
ドルビーオーディオ対応コンテンツがDRMキーで暗号化されている場合、AudioTrackではサポートされません。そのため、ドルビーオーディオビットストリームが暗号化されている場合は、MediaCodec APIを使用してビットストリームを復号化してからAudioTrackに伝送する必要があります。
Androidでは、「OMX.google.raw.dec」というMediaCodecインターフェイスを介して汎用RAW形式のオーディオデコーダーを提供しています。これは、基本的にNOP(ノーオペレーション)コピーデコーダーです。ビットストリームが暗号化されている場合は、MediaCrypto APIでビットストリームを復号してから出力します。アプリはこのデコーダーを使用して、暗号化されたドルビービットストリームを復号化して、暗号化されていないドルビービットストリームをAudioTrackに伝送する必要があります。
必要に応じて、MediaCodecインターフェイスを介してプラットフォームでドルビーデコーダーをサポートできます。このデコーダーは、ドルビーオーディオビットストリームをPCMに復号化します。アプリはfindDecoderForFormatを使用して、ドルビーMIMEタイプをサポートするデコーダーの存在を検出できます。
3. サポートされているほかのメディアプレーヤーを使用する方法
Amazon Fire TVでは、ドルビーオーディオ対応コンテンツやDRMコンテンツの再生に、VisualOn、NexPlayerなどのメディアプレーヤーも使用できます。詳細については、メディアプレーヤーを参照してください。
4. Android MediaPlayerを使用する方法
アプリはAndroid MediaPlayerを使用して、ドルビー対応コンテンツを再生することもできます。
注: Android MediaPlayerは、ステレオPCMコンテンツの出力にのみ対応しており、パススルー再生はサポートしていません。
ドルビー非対応のエンドポイントとプライベートリスニングモードの処理
このセクションでは、ドルビー非対応のエンドポイントやヘッドホン(Bluetooth)などに接続したAmazon Fire TVデバイスで、ドルビーオーディオ対応コンテンツを再生する際の推奨事項とベストプラクティスについて説明します。これらのガイドラインに従えば、ドルビーオーディオ対応コンテンツの再生に最適なユーザーエクスペリエンスを実現することができます。
既に説明したように、Android Lでは、AudioManagerにACTION_HDMI_AUDIO_PLUGインテントと呼ばれる新しいAPIを導入しています。このインテントによって、アプリは接続先のエンドポイント(AVRまたはTV)の機能を検出することができます。この検出に基づいて、HDMIに関連するさまざまな状況でドルビーオーディオ対応コンテンツの再生がサポートされます。
HDMI非対応のシンクデバイス(Bluetoothヘッドセットなど)に接続するときは、AudioTrackを再作成し、ドルビー非対応のオーディオコンテンツ(AACなど)に切り替えることをお勧めします。そうすれば、ドルビーオーディオ対応コンテンツよりも帯域幅の使用を減らすことができます。
ただし、アプリがドルビー非対応の代替オーディオコンテンツを選択できず、ドルビーオーディオのストリーミングを続行する場合は、MediaCodecを使用して、コーデックをパススルー(OMX.google.raw.dec)から適切なドルビーコーデック(OMX.dolby.ac3.decoderまたはOMX.dolby.eac3.decoder)に切り替える必要があります。
MediaCodecデコーダーは、ドルビービットストリームをデコードし、ステレオPCMにダウンミックスします。
このPCMデータをレンダリングするには、AudioTrackをENCODING_PCM_16BIT
オーディオ形式で再作成する必要があります。
ドルビーデコーダーはあらゆるプラットフォームでマルチチャネルコンテンツをステレオにダウンミックスします。このため、エンドポイントがDDまたはDDPをサポートしていない場合にドルビーオーディオ対応コンテンツを選択しても具体的なメリットはありません。
- Q.Fire TV Edition(日本未対応)の場合、接続されるエンドポイントの機能をアプリはどのように検出しますか(上記のACTION_HDMI_AUDIO_PLUGなど)?
- デフォルトでは、Fire TV Edition(日本未対応)のスピーカーはステレオ出力のみサポートしています。このため、アプリはデフォルトでステレオコンテンツをストリーミングできます。ただし、ドルビーパススルーがサポートされているので、TVスピーカーで再生する場合は、この方法が推奨されます。
Fire TV Edition(日本未対応)でユーザーがドルビーシステム設定を選択した場合、Fire TVがオプティカルオーディオ出力またはHDMI経由でAVRやサウンドバーに接続されていれば、アプリはドルビーオーディオ形式でのサラウンドサウンドのストリーミングを選択できます。 -
これをサポートするには、アプリがグローバル設定
external_surround_sound_enabled
を読み取り、サラウンドサウンド(AC3、EAC3)がサポートされているかどうかを判断する必要があります。値が1
の場合はドルビーオーディオがサポートされています。値が0
の場合、アプリはさらに別の手段(ACTION_HDMI_AUDIO_PLUGなど)を使用することで、サラウンドサウンドのサポート状況を判断できます。詳細については、このExoPlayerパッチ(Added support for Surround Sound detection for Optical out)を参照してください。 - Q.接続先のエンドポイントがDDのみをサポートし、DDPをサポートしていない場合、再生にはどのオーディオストリームを選択すればよいですか?
- ほとんどのAmazonデバイスは、DDPコンテンツを自動的にDDにトランスコードし、DDのみをサポートするシンクデバイスにパススルーする機能を備えています。
これは、AmazonデバイスがDDのサポートも通知することを前提としています。前述のように、DDがサポートされていない場合は、ドルビー非対応の代替オーディオトラックを選択するか、DDPコンテンツをPCMにデコードする必要があります。