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

时间:2015-11-09 13:05:33

标签: android mediacodec aac mediaextractor

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

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

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

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

修改MediaFormatMediaCodec返回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

要在csd-0上正确播放,我需要将采样率设置为2 *采样率= 44100.

我想知道csd-0是否包含更多信息来推断个人资料/格式/等。对于上面的示例,0x13 0xffffff90 0x56 0xffffffe5 0xffffffa0 缓冲区中的5个字节如下所示:

try {
runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(context, text, duration).show();
                    }
                });
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

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

1 个答案:

答案 0 :(得分:1)

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