Android AC-3 的 MediaCodec

Android MediaCodec for AC-3

我正在尝试使用 Android MediaCodec API 解码 AC3 音频。如果我将 csd-0 设置为 elementary stream descriptor.

,我可以成功解码 AAC

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

AMEDIAFORMAT_KEY_MIME: "audio/ac3"
AMEDIAFORMAT_KEY_CHANNEL_COUNT: 6
AMEDIAFORMAT_KEY_SAMPLE_RATE: 48000
AMEDIAFORMAT_KEY_IS_ADTS: 0

在调用 AMediaCodec_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(这是 MediaCodec 内部使用的标准)中处理 AC-3 的官方规范,但尽管如此,一些制造商确实公开了此类解码器。

我早些时候曾尝试在 Samsung Galaxy S3 上进行此类解码,它似乎确实有效,而且我不需要传递任何额外数据。有关此实验的信息,请参阅 https://github.com/mstorsjo/vlc/commit/omxil-ac3

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