适用于AC-3的Android MediaCodec

适用于AC-3的Android MediaCodec,android,audio,android-ndk,android-mediacodec,Android,Audio,Android Ndk,Android Mediacodec,我正在尝试用Android MediaCodec API解码AC3音频。如果我将csd-0设置为,我可以成功解码AAC 尝试解码AC3时,我在配置中使用以下MediaFormat: AMEDIAFORMAT_KEY_MIME: "audio/ac3" AMEDIAFORMAT_KEY_CHANNEL_COUNT: 6 AMEDIAFORMAT_KEY_SAMPLE_RATE: 48000 AMEDIAFORMAT_KEY_IS_ADTS: 0 在调用AMediaCodec\u configur

我正在尝试用Android MediaCodec API解码AC3音频。如果我将
csd-0
设置为,我可以成功解码AAC

尝试解码AC3时,我在配置中使用以下MediaFormat:

AMEDIAFORMAT_KEY_MIME: "audio/ac3"
AMEDIAFORMAT_KEY_CHANNEL_COUNT: 6
AMEDIAFORMAT_KEY_SAMPLE_RATE: 48000
AMEDIAFORMAT_KEY_IS_ADTS: 0
在调用
AMediaCodec\u configure
时,我收到以下错误消息:

01-22 12:37:58.760: E/ACodec(10548): [OMX.Nvidia.bypass.decoder] configureCodec returning error -2147483648
01-22 12:37:58.760: E/ACodec(10548): signalError(omxError 0x80001001, internalError -2147483648)
01-22 12:37:58.760: E/MediaCodec(10548): Codec reported err 0x80001001, actionCode 0, while in state 3
01-22 12:37:58.760: E/MediaCodec(10548): configure failed with err 0x80001001, resetting...

我需要为解码器提供一些额外的数据吗?我不熟悉AC3标准,也许有一个与基本流描述符等效的描述符必须在
csd-0

中提供,但没有关于如何在OpenMAX IL中处理AC-3的官方规范(这是MediaCodec内部使用的标准),但尽管如此,一些制造商还是公开了此类解码器

早些时候,我曾尝试在三星Galaxy S3上进行这种解码,它似乎确实可以工作,我不需要传递任何额外的数据。有关此实验的信息,请参阅


我不知道这个特定的Nvidia解码器是否有不同的行为,或者两者之间的ACodec/MediaCodec级别是否缺少其他东西,这使得它无法使用。(上面的例子在MediaCodec可用之前直接使用了内部OMX API。)为了完成答案,我想我应该在Galaxy S3上重新测试这个实验,通过OMX直接测试和MediaCodec测试,然后在Nvidia设备上测试(这是您正在测试的Nexus 9还是其他什么?。

再次感谢!令人鼓舞的是,它在没有任何额外数据的情况下工作:)我正在使用ADT,但很快就会得到一些更好的硬件,有望更好地支持所有编解码器:)FWIW,我在三星Galaxy S3(Exynos芯片组)上重新测试了这一点,AC3解码器似乎通过MediaCodec工作良好。它没有在MediaCodecList中公开,但如果您知道编解码器名称(
OMX.SEC.ac3.dec
),它就可以工作。我还检查了Nvidia设备(Nexus 7 2012和Nexus 9),但它们似乎都没有任何解码器匹配MediaCodeList中的
audio/ac3
。代码段中解码器的名称
OMX.Nvidia.bypass.decoder
,似乎表明音频实际上不会被解码,但是绕过了android设备之外的一些解码器。(IIRC HDMI支持AC3音频,因此它可以将其与屏幕图片一起传送到电视“硬件”。)