开发人员控制台

杜比集成指南


杜比集成指南

本文档为需要在其应用中支持Dolby Digital或Dolby Digital Plus音频内容的应用开发者提供了集成指南。

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

术语

本文中使用的缩写:

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

播放杜比音频的四种方法

您可以通过四种方式在应用中播放杜比(DD或DDP)音频内容:

  1. 自定义媒体播放器方法
  2. ExoPlayer
  3. 其他支持的媒体播放器
  4. 安卓媒体播放器

方法1: 自定义媒体播放器方法

实施一个使用AudioManagerAudioTrack和(可选)MediaCodec API的自定义播放器。本节规定了如何使用AudioManager、AudioTrack和可选的MediaCodec API来播放杜比音频内容(与安卓推荐一致)。

AudioManager概述

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

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

AudioTrack概述

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

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

应用可使用ACTION_HDMI_AUDIO_PLUG请求,以查找连接的设备支持的杜比编码格式列表,使用支持的杜比编码格式创建AudioTrack,并将相应的杜比原始位流(明文)作为输入传递到AudioTrack,从而实现杜比直通播放。

或者,如果所连接的终端节点仅支持DD,AudioTrack也支持将DDP位流转码为DD。如果终端节点仅支持DD,则通过将ENCODING_E_AC3添加到ACTION_HDMI_AUDIO_PLUG请求的EXTRA_ENCODINGS额外信息中,应用就可以使用此功能。

因此,在应用上,支持DD的终端节点也支持DDP,并且可以继续将DDP位流发送到AudioTrack,AudioTrack会在传递之前将位流转码为DD。

MediaCodec(可选)概述

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

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

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

下表总结了典型Android TV中(不支持AudioTrack中DDP到DD的转码)的各种杜比播放场景。

所连接的终端节点功能(AVR或电视) ACTION_HDMI_AUDIO_PLUG请求
中的EXTRA_ENCODINGS
源音频流 MediaCodec(可选) AudioTrack编码格式 情景
EAC3、AC3和PCM ENCODING_E_AC3、ENCODING_AC3、ENCODING_PCM_16BIT 明文EAC3或AC3 ENCODING_E_AC3或ENCODING_AC3 DDP或DD直通
加密的EAC3或AC3 OMX.google.raw.dec
AC3和PCM ENCODING_AC3、ENCODING_PCM_16BIT 明文AC3 ENCODING_AC3 DD直通
加密AC3 OMX.google.raw.dec
PCM ENCODING_PCM_16BIT AAC或任何非杜比格式(推荐) OMX.google.aac.decoder ENCODING_PCM_16BIT PCM播放
AC3或EAC3(仅当非杜比流不可用且平台中有可用的杜比解码器时) OMX.google.aac.decoder、OMX.dolby.eac3.decoder ENCODING_PCM_16BIT DD或DDP解码

Amazon Fire TV(第2代)和Fire TV Edition中的杜比支持

Fire TV(第2代)中对4K的支持随基于Android L的Fire OS 5推出,并完全符合Android L的推荐杜比架构。本节介绍Fire TV(第2代)中的杜比支持。

AudioTrack – Amazon Fire TV(第2代)和Fire TV Edition

AudioTrack同时支持DDP/DD直通和DDP到DD转码器。AudioTrack接收杜比原始位流,并根据终端节点的杜比功能,决定执行DD/DDP直通还是DDP到DD转码和直通。

AudioManager – Amazon Fire TV(第2代)和Fire TV Edition

由于当所连接终端节点仅支持DD时,AudioTrack还支持将DDP位流转码为DD,因此AudioManager通过将ENCODING_E_AC3添加到ACTION_HDMI_AUDIO_PLUG请求的EXTRA_ENCODINGS额外信息 中来指示这一点。

因此,从应用的角度来看,支持DD的端点也支持DDP,并且可以继续将DDP位流发送到AudioTrack,AudioTrack会在传递之前将位流转码为DD。

MediaCodec – Amazon Fire TV(第2代)和Fire TV Edition

杜比解码器的MediaCodec(OMX.dolby.ac3.decoder和OMX.dolby.eac3.decoder)仅支持解码到PCM。此外,杜比解码器还将多声道输出向下混音为立体声。因此,不管内容有多少输入通道,输出始终是立体声PCM。下表总结了Fire TV(第2代)中的各种杜比播放场景:

所连接的终端节点功能(AVR或电视) ACTION_HDM_AUDIO_PLUG请求
中的EXTRA_ENCODINGS
源音频流 MediaCodec MediaCodec的输出Mime类型 AudioTrack编码格式 情景
EAC3、AC3和PCM ENCODING_E_AC3、ENCODING_AC3、ENCODING_PCM_16BIT EAC3或AC3 OMX.google.raw.dec** audio/eac3或audio/ac3 ENCODING_E_AC3或ENCODING_AC3 DDP/DD直通
AC3和PCM ENCODING_E_AC3*、ENCODING_AC3、ENCODING_PCM_16BIT EAC3或AC3 OMX.google.raw.dec** audio/eac3或audio/ac3 ENCODING_E_AC3或ENCODING_AC3 DDP到DD转码或DD直通
仅PCM ENCODING_PCM_16BIT AAC
(推荐)
OMX.google.raw.dec** audio/raw ENCODING_PCM_16BIT AAC解码
EAC3 OMX.dolby.eac3.decoder audio/raw ENCODING_PCM_16BIT DDP解码
AC3 OMX.dolby.ac3.decoder audio/raw ENCODING_PCM_16BIT DDP解码

* 因为支持从DDP转码到DD。
** 内容未加密时可选。

Fire TV Stick(第1代)中的杜比支持

Fire TV Stick(第1代),基于JellyBean Android OS,在Android L发布之前推出。Android L正式在Android TV中引入了对杜比直通音频的支持。

Android L在平台中提供了一个推荐的杜比集成架构,但遗憾的是该架构与Fire TV Stick(第1代)的杜比集成架构不匹配。本节介绍了Fire TV Stick(第1代)中的杜比支持。

MediaCodec – Fire TV Stick(第1代)

处理杜比位流的MediaCodec支持所有场景: 杜比直通、转码和解码。MediaCodec根据所连接终端节点的杜比功能和系统的杜比设置,来选择处理传入杜比位流的适当模式。

  • 对于杜比直通或转码模式,解码器将原始输入杜比位流转换为IEC61937封包化格式。
  • 对于杜比解码模式,杜比解码器还将多声道输出向下混音为立体声PCM。因此,不管内容有多少输入通道,输出始终是立体声PCM。可用的解码器包括用于处理DDP位流的OMX.dolby.ec3.decoder和用于处理DD位流的OMX.dolby.ac3.decoder。

下表列出了MediaCodec的功能。

终端节点功能 输入流类型 编解码器 杜比设置 输出格式MIME类型 备注
DDP、DD和PCM DDP OMX.dolby.ec3.decoder DDP over HDMI或DDP Auto audio/ec3* DDP直通
DDP OFF audio/raw DDP解码
DD OMX.dolby.ac3.decoder DDP over HDMI或DD over HDMI或DDP Auto audio/ac3 DD直通
DD和PCM DDP OMX.dolby.ec3.decoder DDP over HDMI、DD over HDMI、DDP Auto audio/ec3* DDP转DD
DDP OFF audio/raw DDP解码
DD OMX.dolby.ac3.decoder DDP over HDMI、DD over HDMI或DDP Auto audio/ac3 DD直通
DDP OFF audio/raw DD解码
PCM DDP OMX.dolby.ec3.decoder 不适用 audio/raw DDP解码
DD OMX.dolby.ac3.decoder 不适用 audio/raw DDP解码

* eac3中缺少“a”是有意为之。这是Fire TV Stick(第1代)和Amazon Fire TV之间的细微差别。

AudioTrack – Fire TV Stick(第1代)

Fire TV Stick(第1代)中的AudioTrack的限制 —— 不支持杜比转码或杜比解码,只支持杜比直通。此外,输入杜比位流必须采用IEC61937封包化格式,这与杜比MediaCodec解码器的输出相同。

由于Fire TV Stick(第1代)和Android L之间的这些架构差异,应用开发者须对其应用进行大改,才能支持杜比音频内容播放。应用必须始终通过MediaCodec(即使内容未加密)来处理杜比位流,并且必须根据MediaCodec指示的输出MIME类型配置AudioTrack。关于此过程的更多详细内容,参见以下步骤。

A.按MIME类型创建解码器

按MIME类型(audio/eac3、audio/ec3或audio/ac3)创建MediaCodec。这是创建编解码器的通用安卓方式 ——不需要自定义更改。

B.处理MediaCodec输出格式更改通知

当应用开始使用MediaCodec来处理输入位流时,会检测输出格式更改,并在dequeueOutputBuffer API调用中返回INFO_OUTPUT_FORMAT_CHANGED。应用必须处理此响应,并使用getOutputFormat API找出输出格式MIME类型。同时根据下表,使用此MIME类型来配置AudioTrack:

MIME类型音频格式值  
audio/eac3 ENCODING_E_AC3
audio/ac3 ENCODING_AC3
audio/raw ENCODING_PCM_16BIT

C.AudioTrack的杜比编码格式限制

杜比编码格式ENCODING_E_AC3和ENCODING_AC3的AudioTrack的限制和已知问题:

  • AudioTrack开始/暂停API无效。您的应用可能会在创建之后立即开始向AudioTrack写入数据,从而开始播放,而不会等待开始API被调用。
  • AudioTrack的getTimeStamp API(这是在KitKat中引入的)向后移植到基于Jelly-Bean的Amazon Fire TV(第1代)和Fire TV Stick(第1代),并可用于A/V同步逻辑。

Amazon Fire TV(第1代)中的杜比支持

Fire TV(第1代)最初建立在基于Jelly-Bean的操作系统上,并早在Android L推出之前就已推出 —— 后者在Android TV中正式引入对杜比音频直通的支持。

Android L在平台中提供了一个推荐的杜比集成架构,但遗憾的是,该架构与Fire TV(第1代)上的杜比集成架构不完全匹配。本节介绍Fire TV(第1代)中的杜比架构。

MediaCodec – Amazon Fire TV(第1代)

Fire TV(第1代)中杜比MIME类型的默认MediaCodec仅为直通解码器,可将输入数据复制到输出数据,而不更改MIME类型。因此,输出格式与输入格式具有相同的MIME类型。

可用的解码器包括用于处理DDP位流的OMX.qcom.audio.decoder.passthrougheac3,以及用于处理DD位流的OMX.qcom.audio.decoder.passthroughac3。此外,这些解码器也会解密由DRM方案加密的数据。因此,如果内容通过DRM加密,应用必须使用此解码器。否则,如果不使用此解码器,杜比位流可以直接传递到AudioTrack。

AudioTrack – Amazon Fire TV(第1代)

AudioTrack在内部处理杜比直通、杜比解码和杜比转码。这意味着,根据所连接终端节点的杜比功能和系统杜比设置,AudioTrack会选择处理传入杜比位流的适当模式。

终端节点功能 输入流类型 杜比设置 HDMI输出 备注
DDP、DD和PCM DDP DDP over HDMI/Optical或DDP Auto DDP DDP直通
DDP OFF PCM DDP解码
DD DDP over HDMI/Optical、DD over HDMI或DDP Auto DD DD直通
DD和PCM DDP DDP over HDMI/Optical、DD over HDMI或DDP Auto DD DDP转DD
DDP OFF PCM DDP解码
DD DDP over HDMI/Optical、DD over HDMI或DDP Auto DD DD直通
DDP OFF PCM DD解码
PCM DDP或DD 不适用 PCM DD或DDP解码

AudioTrack的杜比编码格式限制 – Amazon Fire TV(第1代)

杜比编码格式ENCODING_E_AC3和ENCODING_AC3的AudioTrack的限制和已知问题:

  • AudioTrack的getPlaybackHeadPosition API还没有实现。因此,不能根据这一API进行A/V同步。您的应用也不得调用此API。否则可能会导致崩溃。
  • AudioTrack的开始/暂停API无效。您的应用可能会在创建之后立即开始将数据写入AudioTrack,并开始播放,而不会等待开始API被调用。
  • AudioTrack的getTimeStamp API(这是在KitKat中引入的)向后移植到基于Jelly-Bean的Fire TV(第1代)和Fire TV Stick(第1代),并可通过反射用于A/V同步逻辑。

方法2: 使用ExoPlayer

ExoPlayer是Google支持的开源播放器,支持播放杜比音频流。但是,由于标准Android L设备和Amazon Fire TV(第1代)系列设备之间的杜比支持架构差异(如前面部分所述),ExoPlayer无法播放杜比音频内容。

亚马逊为Exoplayer开发了补丁,以便在Fire TV(第1代)系列设备中播放杜比音频内容。这些补丁在此处开源提供:exoplayer-amazon-port。此端口还提供播放PlayReady DRM保护内容所需的其他补丁。(请注意,每个“amazon/rx.y.z”分支均映射到ExoPlayer版本x.y.z。)

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

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

方法4: 使用安卓媒体播放器

您的应用可以使用安卓媒体播放器播放杜比内容。

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

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

如前所述,Android L在AudioManager中引入了一个名为ACTION_HDMI_AUDIO_PLUG请求的新API。此请求允许应用检测所连接终端节点(AVR或TV)的功能。在包含专属聆听在内的各种场景中,可利用该检测支持杜比音频内容播放。

问:对于Amazon Fire TV和Fire TV Stick(第1代),应用如何检测所连接终端节点的功能?
应用必须注册一个广播接收器才能接收ACTION_HDMI_AUDIO_PLUG请求并读取请求中的EXTRA_ENCODINGS额外信息值。此编码值列表将指示终端节点功能。可能值为ENCODING_XXXX值中的一个(例如ENCODING_PCM_16BITENCODING_AC3ENCODING_E_AC3等)。
问:对于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时,应选择哪个音频流进行播放?
在这类情况下,让您的应用选择非杜比音频内容(例如,AAC)进行播放。与杜比音频内容相比,此选项可减少带宽使用。

但是,如果应用无法选择其他非杜比音频内容,而是选择继续流式播放杜比(DD或DDP)音频,则必须为每台设备执行以下操作。

  • Amazon Fire TV(第1代): 将杜比原始位流发送到AudioTrack,AudioTrack会在内部解码并向下混音为立体声PCM。
  • Fire TV Stick(第1代)和Amazon Fire TV(第2代): 使用杜比的MediaCodec(OMX.dolby.ac3.decoder或OMX.dolby.eac3.decoder)。该MediaCodec解码杜比位流,向下混音为立体声PCM,并使用ENCODING_PCM_16BIT音频格式配置AudioTrack,以渲染PCM数据。由于所有平台中的杜比解码器都将多声道内容向下混音为立体声,因此在终端节点不支持DD或DDP时,选择杜比音频内容并无真正的优势。
问:当所连接终端节点支持DD但不支持DDP时,应选择哪个音频流进行播放?
由Fire TV设备决定:
  • Amazon Fire TV(第1代)和Amazon Fire TV(第2代): AudioTrack支持将DDP位流转码为DD。因此,即使终端节点仅支持DD,AudioManager也会将DDP作为支持的功能添加到ACTION_HDMI_AUDIO_PLUG请求中。因此,在应用上,支持DD的终端节点也支持DDP(通过在AudioTrack中进行转码)。
  • Fire TV Stick(第1代): 应用可以选择任一音频内容进行播放,因为MediaCodec会根据终端节点功能确定是进行直通、转码还是解码。在这种使用情形中,MediaCodec会传递DD或将DDP转码为DD然后传递DD。
问:当所连接终端节点支持DDP和DD时,应选择哪个音频流进行播放?
Amazon Fire TV(第1代)和Amazon Fire TV(第2代): 应用可以选择DDP或DD音频内容进行播放。如果音频未加密,应用可将此明文DD/DDP位流数据按原样发送到AudioTrack。在内部,AudioTrack会将DD/DDP位流传递到所连接终端节点。

如果音频内容受DRM保护,应用必须实例化以下MediaCodec来解密位流:

  • 在Amazon Fire TV(第1代)中为OMX.qcom.audio.decoder.passthrougheac3OMX.qcom.audio.decoder.passthroughac3。这一特殊的解码器是一个支持解密的无操作直通解码器(即,如果需要,它会在解密后将输入位流复制到输出中)。

  • 在Amazon Fire TV(第2代)中为OMX.google.raw.dec(按名称)。这一特殊的解码器是一个支持解密的无操作直通解码器(即,如果需要,它会在解密后将输入位流复制到输出中)。

Fire TV Stick(第1代): 应用可以选择任一音频内容进行播放,因为MediaCodec会根据终端节点功能确定是进行直通、转码还是解码。在这一使用情形中,MediaCodec会传递杜比音频内容。

问:在杜比直通播放期间,应用如何处理涉及音频耳机或蓝牙A2DP耳机的专属聆听使用情形?
Amazon Fire TV(第1代): 应用无须特殊操作,即可处理专属聆听使用情形。处理在AudioTrack内部自动进行(从直通切换到解码运行模式)。

Fire TV Stick(第1代)和Amazon Fire TV(第2代): 在杜比直通播放期间,当音频耳机(通过游戏控制器)或蓝牙耳机连接到设备时,操作系统会通过修改后的额外信息值重新广播ACTION_HDMI_AUDIO_PLUG请求。

通过游戏控制器连接的音频耳机或蓝牙耳机不支持杜比直通,因此对额外信息值进行编码现仅编码为ENCODING_PCM_16BIT。应用必须注册才能在播放期间接收此请求,并重新配置音频管道以执行以下操作之一:

  • 中途切换到备用的非杜比音频内容(例如AAC)
  • 如果备用音频内容不可用,请重新配置音频管道以使用MediaCodec杜比解码器将杜比内容解码为立体声PCM。对于Fire TV Stick(第1代),在重新创建音频管道时,须重新创建MediaCodec。