2

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

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

尽管如此,要在实例上播放音轨,AudioTrack我必须使用正确的(播放)采样率来配置它,即 44100 而不是 22050。

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

编辑:我确实检查了MediaFormat何时MediaCodec返回MediaCodec.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我需要将采样率设置为 2 * 采样率 = 44100。

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

0x13 0xffffff90 0x56 0xffffffe5 0xffffffa0

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

4

1 回答 1

1

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

于 2015-11-09T13:40:17.417 回答