首页 文章

识别Android上的HE-AAC音频,以便正确解码和播放

提问于
浏览
2

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

当查询轨道的 MediaFormatMediaFormat.KEY_SAMPLE_RATE 时,我实际上只得到预期大小的一半,例如对于需要回放采样率为44100的轨道, MediaFormat 返回22050.在阅读HE-AAC的一些文档后,我理解这是"correct"的术语该编解码器的工作原理 .

尽管如此,要在 AudioTrack 实例上回放音频轨道,我必须使用正确的(回放)采样率(44100而不是22050)对其进行配置 .

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

Edit: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

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

1 回答

  • 1

    您应该只将 MediaExtractor 返回的 MediaFormat 视为提示;你需要查看 MediaCodec 返回 INFO_OUTPUT_FORMAT_CHANGED 的内容,这应该返回真正的samplerate . 这意味着只有在内容解码开始后才能配置 AudioTrack .

相关问题