【问题标题】:Identify HE-AAC audio on Android for proper decoding and playback识别 Android 上的 HE-AAC 音频以进行正确解码和播放
【发布时间】:2016-02-10 03:17:40
【问题描述】:

我在 Android(目标 API 级别 >= 16)上使用 MediaExtractor / MediaCodec 组合来解码音频流。现在,在播放包含 MPEG-4 HE-AAC 音频数据的 mp4/m4a 容器时,我遇到了一个微妙的问题。

在为MediaFormat.KEY_SAMPLE_RATE 查询轨道的MediaFormat 时,我实际上只得到了预期大小的一半,例如对于需要播放采样率为44100 的轨道,MediaFormat 返回 22050。在阅读了一些关于 HE- 的文档后AAC 我知道就编解码器的工作方式而言,这是“正确的”。

不过,要在 AudioTrack 实例上播放音轨,我必须使用正确的(播放)采样率对其进行配置,即 44100 而不是 22050。

因此,我正在寻找一种方法来确定音频何时以 API 目标级别 >= 16 进行 HE-AAC 编码,因此我可以将 AudioTrack 的采样率设置为报告采样率的两倍。

编辑:MediaCodec返回MediaCodec.INFO_OUTPUT_FORMAT_CHANGED时,我确实检查了MediaFormat。格式如下所示:

max-input-size=946, 
aac-profile=2, 
mime=audio/mp4a-latm, 
durationUs=158499410,
csd-0=java.nio.ByteArrayBuffer[position=0,limit=5,capacity=5], 
channel-count=2, 
sample-rate=22050

要在AudioTrack 上正确播放,我需要将采样率设置为 2 * sample-rate = 44100。

我想知道csd-0 是否包含更多信息来推断配置文件/格式/等。对于上面的示例,csd-0 缓冲区中的 5 个字节如下所示:

0x13 0xffffff90 0x56 0xffffffe5 0xffffffa0

现在我想知道这个“编解码器特定数据”的具体结构

【问题讨论】:

    标签: android android-mediacodec aac mediaextractor


    【解决方案1】:

    您应该只将MediaExtractor 返回的MediaFormat 视为提示;您需要查看MediaCodecINFO_OUTPUT_FORMAT_CHANGED 返回的内容,这应该返回真实的采样率。这意味着您只能在内容解码开始后配置AudioTrack

    【讨论】:

    • 我已经这样做了。实际上,INFO_OUTPUT_FORMAT_CHANGED 触发时的格式如下所示:{max-input-size=946, aac-profile=2, mime=audio/mp4a-latm, durationUs=158499410, csd-0=java.nio.ByteArrayBuffer[position=0,limit=5,capacity=5], channel-count=2, sample-rate=22050} 但我必须在AudioTrack 上设置的实际采样率仍然是 44100
    • 那听起来很糟糕 - 这是哪个解码器 (MediaCodec.getName()),在什么设备上?如果你使用OMX.google.aac.decoder(你可以通过MediaCodecList找到)我猜你会得到正确的采样率(虽然我还没有验证过)。
    • 确实是OMX.google.aac.decoder 正在使用。设备是 Moto G 2nd Gen,但在 S4 Mini 上也是如此。
    • 没关系 - 在发出INFO_OUTPUT_FORMAT_CHANGED 信号后从MediaCodec 检索到的MediaFormat 是配置播放的正确选择。我仍在查看当然不会更新的初始格式...
    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多