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
答案 0 :(得分:1)
首先,这个问题很难理解 - 所列出的MediaFormat内容都显示channel-count=1
,因此对问题本身的实际解释很少,只是对其他周边细节的解释。
然而 - 某些Android版本中的软件AAC解码器(4.1如果我没记错的话,也可能是4.2)将单声道AAC解码为立体声 - 不确定某些硬件AAC解码器是否也这样做。你可以争论这是一个错误还是只是意外的行为,但它是你必须要忍受的东西。在即使输入是单声道的情况下解码器返回立体声数据的情况下,两个立体声声道将具有相同的(单声道)内容。
所以基本上,你必须准备好处理这个 - 要么将解码器(而不是MediaExtractor)的实际格式信息传递给使用数据的人(例如将音频输出重新配置为立体声),要么准备混合如果你真的需要以单声道格式输出,请将立体声转回单声道。