ドルビーの統合に関するガイドライン
この統合ガイドラインでは、ドルビーオーディオ対応コンテンツに対応したアプリ開発について取り上げます。
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推奨のアプローチです。
ドルビーサポートの検出
以下の方法を使用し、オーディオ機能のテストを簡単に行うには、テストアプリを使用してください。
方法1: EXTRA_ENCODINGS
Android L(APIレベル21)では、HDMIシンクデバイスの機能を通知できるように、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 - Fire OS 7以上で追加)
アプリはブロードキャストレシーバーを登録してACTION_HDMI_AUDIO_PLUGインテントを受信し、このインテントからEXTRA_ENCODINGSやEXTRA_AUDIO_PLUG_STATEなどの情報を取得できます。
BroadcastReceiver mAudioHDMIPlugReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null) {
if (intent.getIntExtra(AudioManager.EXTRA_AUDIO_PLUG_STATE, 0) == 0) {
// HDMIの切断状態を処理します
} else {
// EXTRA_ENCODINGSを処理します
int[] extraEncodings = intent.getIntArrayExtra(AudioManager.EXTRA_ENCODINGS);
}
}
}
};
- HDMIが切断された場合は、すべてのデバイスでサポートされている最小限のオーディオ機能を返します。これは通常、AudioFormat.ENCODING_PCM_16BITである必要があります。Exoplayerの公式例を参照してください。
- HDMIシンクデバイスがドルビーアトモスをサポートしている場合は、EXTRA_ENCODINGSのリストにAudioFormat.ENCODING_E_AC3_JOC列挙型(18)が格納されます。
方法2:audio_platform_capabilitiesグローバル設定
audio_platform_capabilitiesグローバル設定は、Fire OSのシンク機能を照会するためにAmazonで設計された方法です。AudioServiceが起動すると、audio_platform_capabilitiesが初期化され、JSON形式でグローバル設定に格納されます。これは、シンク機能が変更されると更新されます。
現在のオーディオエンドポイントの機能を取得するには、次のようにグローバル設定のaudio_platform_capabilitiesを照会します。
String audioCapJson = Settings.Global.getString(mContext.getContentResolver(), "audio_platform_capabilities");
機能の変更を意図的に監視する場合は、次のようにContentObserverを使用できます。
ContentResolver mContentResolver = mContext.getContentResolver();
Uri audioPlatformUri = Settings.Global.getUriFor("audio_platform_capabilities");
ContentObserver mAudioPlatformJsonObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
String audioCapJson = Settings.Global.getString(mContentResolver, "audio_platform_capabilities");
Log.d(TAG, "audio_platform_capabilities=" + audioCapJson);
}
};
mContentResolver.registerContentObserver(audioPlatformUri, false, mAudioPlatformJsonObserver);
ドルビーアトモス対応シンクにおける、audio_platform_capabilitiesのJSON文字列の例を以下に示します。
{
"audiocaps": {
"pcm" : {
"mixing" : true
},
"ddplus" : {
"mixing" : true
},
"atmos" : {
"enabled" : true
}
}
}
ドルビーアトモス機能を確認するには、次のようにaudiocaps.atmos.enabledを照会します。
String audioCapJsonStr = Settings.Global.getString(mContext.getContentResolver(), "audio_platform_capabilities");
JSONObject mAudioCapJson = new JSONObject(audioCapJson).getJSONObject("audiocaps");
JSONObject mAtmosCapJson = mAudioCapJson.getJSONObject("atmos");
boolean atmosEnabled = mAtmosCapJson.getBoolean("enabled");
audio_platform_capabilitiesグローバル設定を確認すれば、製品・Fire OSのバージョン・各種オーディオエンドポイントを区別する必要はありません。将来的には、サポートされているサンプルレートなど、より多くの情報がaudio_platform_capabilities設定で提供される予定です。
方法3: AudioDeviceInfo
Android APIレベル23では、getEncodingsというAPIが追加されています。このAPIを使用してシンク機能を照会することもできます。以下に例を示します。
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()));
}
たとえば、TYPE_HDMIのデバイスの場合、出力エンコードリストは次のようになります。
[2, 4, 5, 6, 7, 8, 13]
これは、Androidオープンソースプロジェクト(AOSP)のエンコード名のマッピングでは、[16ビットPCM, ドルビーデジタル, ドルビーデジタルプラス, ドルビーアトモス(ドルビーデジタルプラス), DTS, DTS HD, IEC61937] となります。
推奨される方法
Fire OS 7デバイス
方法1: EXTRA_ENCODINGSを使用して、ドルビーアトモスを含むすべての機能の変更を検出します。
Fire OS 6デバイス
方法1: EXTRA_ENCODINGSを使用して、機能の変更を検出します。ドルビーアトモスのコンテンツをストリーミングする場合は、方法2:audio_platform_capabilitiesグローバル設定を使用して、アトモスの機能を確認します。
テストアプリ
上記の検出方法に基づいてすべての情報を確認する際は、以下のオーディオテストアプリを使用できます。
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にデコードする必要があります。
Last updated: 2022年2月22日