使用mediacodec的Aac编码器用一个通道初始化,但输出为两个通道

时间:2014-12-17 13:04:43

标签: android audio aac mediacodec

aac解码器初始化如下:

MediaFormat outfmt = new MediaFormat();
outfmt.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
outfmt.setInteger(MediaFormat.KEY_AAC_PROFILE, mAudioProfile);
mSampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
outfmt.setInteger(MediaFormat.KEY_SAMPLE_RATE, mSampleRate);
mChannels = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
outfmt.setInteger(MediaFormat.KEY_CHANNEL_COUNT, mChannels);
outfmt.setInteger(MediaFormat.KEY_BIT_RATE, 64000);
audioEncoder.configure(outfmt, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
            audioEncoder.start();

但两个设备上的编码器行为不同。

一个输出正常呈现: 64000 128000 192000 256000 320000

另一个输出为两个通道: 64000 64000 128000 128000 192000 192000 256000 256000 320000 320000

使用MediaExtractor提取的格式在两个设备上有所不同:

正常的是     {max-input-size = 1572864,aac-profile = 2,     csd-0 = java.nio.ByteArrayBuffer [position = 0,limit = 2,capacity = 2],sample-rate = 16000,     durationUs = 8640000,channel-count = 1,mime = audio / mp4a-latm,isDMCMMExtractor = 1}

另一个是     {max-input-size = 798,durationUs = 8640000,channel-count = 1,mime = audio / mp4a-latm,     csd-0 = java.nio.ByteArrayBuffer [position = 0,limit = 2,capacity = 2],sample-rate = 16000}

因此原始音频有一个通道,编码器也配置了一个通道。但编码器输出为双通道方式。

isDMCMMExtractor标志是否重要?

救命!救命! @fadden

1 个答案:

答案 0 :(得分:1)

首先,这个问题很难理解 - 所列出的MediaFormat内容都显示channel-count=1,因此对问题本身的实际解释很少,只是对其他周边细节的解释。

然而 - 某些Android版本中的软件AAC解码器(4.1如果我没记错的话,也可能是4.2)将单声道AAC解码为立体声 - 不确定某些硬件AAC解码器是否也这样做。你可以争论这是一个错误还是只是意外的行为,但它是你必须要忍受的东西。在即使输入是单声道的情况下解码器返回立体声数据的情况下,两个立体声声道将具有相同的(单声道)内容。

所以基本上,你必须准备好处理这个 - 要么将解码器(而不是MediaExtractor)的实际格式信息传递给使用数据的人(例如将音频输出重新配置为立体声),要么准备混合如果你真的需要以单声道格式输出,请将立体声转回单声道。