开发人员控制台

杜比集成指南


杜比集成指南

本文档为需要支持杜比音频内容的应用开发者提供了集成指南。

转至设置>显示和声音>音频>杜比数字输出,查看Amazon Fire TV中的杜比设置。

术语

请注意以下在本文档中使用的缩写:

  • EAC3: Dolby Digital Plus (DDP)
  • AC3: Dolby Digital (DD)

播放杜比音频的四种方法

您可以采用四种方法在应用中播放杜比(DD/DDP/Atmos)音频内容:

  1. ExoPlayer
  2. 使用自定义媒体播放器
  3. 其他支持的媒体播放器
  4. Android媒体播放器

方法1: 使用ExoPlayer

ExoPlayer是Google支持的开源播放器,支持播放杜比音频流。

亚马逊为Exoplayer开发了补丁,以启用或增强杜比音频内容在各种亚马逊设备上的播放。这些补丁在此处开源提供:exoplayer-amazon-port。(请注意,每个“amazon/rx.y.z”分支均映射到ExoPlayer版本x.y.z。)

方法2: 使用自定义媒体播放器

实现一个使用AudioManagerAudioTrackMediaCodec API的自定义播放器。本节说明了如何使用AudioManager、AudioTrack和MediaCodec API来播放Android推荐的杜比音频内容。

检测杜比支持

Android L增强了AudioManager中的ACTION_HDMI_AUDIO_PLUG意图,以报告Lollipop中接收器的功能。将HDMI插入或拔出设备时,都会广播此意图。

此意图还规定,应用须通过意图中提供的EXTRA_ENCODINGS来检测所连接终端节点(AVR或TV)的功能。可能值为ENCODING_XXXX值中的一个。例如:

Android L没有Atmos(ENCODING_E_AC3_JOC)检测的枚举类型,但是我们有一个额外的机制,可通过查询“hdmi_encodings”来公开信息,这与EXTRA_ENCODINGS的方式类似。

AudioManager.getParameters("hdmi_encodings")

例如,如果接收器支持Atmos,则返回的字符串将为:

"pcm;ac3;eac3;atmos;" //fireOS6
"pcm|ac3|eac3|atmos| //fireOS7

注意:​ 即使接收器不支持解码杜比内容,某些平台也将显示杜比支持。此时,平台将杜比编码的内容转码为接收器功能,例如,如果接收器仅支持PCM音频,则传入的杜比音频流将通过Fire TV设备转码为PCM。

使用内置扬声器(而不是通过HDMI接收器)输出音频的Fire TV Edition电视平台和条形音箱不具有上述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补丁(对光学输出的环绕声检测的附加支持)。

Android API级别23添加了一个也可以查询接收器功能的getEncodings API。

AudioManager audio = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
AudioDeviceInfo[] devices = audio.getDevices(audio.GET_DEVICES_OUTPUTS);
for (AudioDeviceInfo device : devices) {
    Log.i(TAG, "Supported Encodings" + Arrays.toString(device.getEncodings()));
}

向应用报告的功能还会受到亚马逊音频设置的影响,例如,如果杜比被禁用,则设备不会报告对杜比的支持。在连接到适当的AVR时,这种情况允许使用多声道PCM。

AudioTrack概述

在AudioFormat中,Android L增加了对ENCODING_AC3ENCODING_E_AC3编码格式的支持。Android P增加了对用于Atmos的ENCODING_E_AC3_JOC的支持。如果AudioTrack配置有杜比编码格式,并且所连接的终端节点支持该编码格式,则AudioTrack接受杜比原始位流作为输入,并在使用IEC61937标准封包后将位流传递到终端节点。AudioTrack仅支持明文(未加密)输入位流。

此外,如果所连接的终端节点不支持该编码格式,则AudioTrack创建失败。

如果连接的终端节点仅支持DD,则某些平台将DDP位流转码为DD。

MediaCodec概述

AudioTrack不支持DRM密钥加密的杜比音频内容。因此,对于加密的杜比音频位流,必须使用MediaCodec API来解密位流,然后将解密的位流传递给AudioTrack。

Android通过名为“OMX.google.raw.dec”的MediaCodec接口提供了一个通用的原始音频解码器,它本质上是一个无操作(no-op)复制解码器。位流如果被加密,则使用MediaCrypto API来解密并输出位流。应用必须使用此解码器来解密加密的杜比位流,并将明文杜比位流传递给AudioTrack。

或者,平台可以通过MediaCodec接口来支持杜比解码器。该解码器将杜比音频位流解码为PCM。应用可以使用findDecoderForFormat来检测是否存在支持杜比MIME类型的解码器。

方法3: 使用其他支持的媒体播放器

您可以使用Amazon Fire TV支持的其他媒体播放器(如VisualOn或NexPlayer)播放杜比音频内容和DRM内容。请参阅媒体播放器了解更多详情。

方法4: 使用Android媒体播放器

您的应用可以使用Android MediaPlayer播放杜比内容。
注意:​ Android MediaPlayer只能输出立体声PCM内容,不支持直通播放。

处理非杜比终端节点和专属聆听模式

本节介绍了在连接到非杜比终端节点和专属聆听(蓝牙)时,在Amazon Fire TV系列设备上播放杜比音频内容的建议和最佳实践。遵循这些准则有助于为您带来杜比音频内容播放的最佳用户体验。

如前所述,Android L在AudioManager中引入了一个名为ACTION_HDMI_AUDIO_PLUG意图的新API。此意图允许应用检测所连接的终端节点(AVR或TV)的功能。此检测可用于支持杜比音频内容在各种HDMI相关场景中播放。

当连接到蓝牙耳机等非HDMI接收器设备时,建议重新创建AudioTrack并切换到非杜比音频内容,例如AAC。与杜比音频内容相比,此选项的优点是可以减少带宽使用。

但是,如果应用无法选择替代的非杜比音频内容并选择继续播放杜比音频,则应用应使用MediaCodec将编解码器从直通(OMX.google.raw.dec)切换到适当的杜比编解码器(OMX.dolby.ac3.decoder或OMX.dolby.eac3.decoder)。
MediaCodec解码器可解码杜比位流,下混合成立体声PCM。
再次创建ENCODING_PCM_16BIT音频格式的AudioTrack之后,才能渲染PCM数据。
由于所有平台中的杜比解码器都将多声道内容向下混音为立体声,因此在终端节点不支持DD或DDP时,选择杜比音频内容并无真正的优势。

问:对于Fire TV Edition,应用如何检测所连接终端节点的功能(如上面提到的ACTION_HDMI_AUDIO_PLUG)?
默认情况下,Fire TV Edition的扬声器仅支持立体声输出,因此应用默认可以播放立体声内容。但是,当在电视扬声器上播放时,支持并建议使用杜比直通。
当电视通过光学音频输出或HDMI连接到条形音箱或AVR(基于用户在Fire TV Edition上设置的杜比系统设置)时,应用可以选择以杜比音频格式播放环绕声。

为此,应用需要读取全局设置external_surround_sound_enabled,以确定是否支持环绕声(AC3和EAC3)。如果值为1,则支持杜比音频。如果值为0,则应用可以进一步使用其他方法(例如使用ACTION_HDMI_AUDIO_PLUG来确定是否支持环绕声)。请参考此Exoplayer补丁(添加了对光学输出的环绕声检测的支持)。

问:当所连接的终端节点支持DD但不支持DDP时,应选择哪个音频流进行播放?
大多数亚马逊设备都能够自动将DDP内容转码为DD,并将内容传递到纯DD接收器设备。
该情况假定亚马逊设备也可报告对DD的支持。如果不支持DD(如上文所述),则需要选择替代的非杜比音频轨道,或者DDP内容需要解码为PCM。