识别安卓系统上的HE-AAC音频,以便正确解码和播放



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

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

尽管如此,要在AudioTrack实例上回放音轨,我必须将其配置为正确的(回放)采样率,即44100而不是22050。

因此,我正在寻找一种方法来确定音频何时是HE-AAC编码,API目标级别>=16,这样我就可以将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*采样率=44100。

我想知道csd-0是否包含更多信息来推断配置文件/格式等。对于上面的例子,来自csd-0缓冲区的5个字节看起来像这样:

0x13 0xffffff90 0x56 0xffffffe5 0xffffffa0

现在我想知道这个"编解码器特定数据"

的具体结构

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

您需要对音频缓冲区重新采样。这是有道理的。https://github.com/google/oboe

相关内容

最新更新