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.ByteArrayBufferposition=0,limit=2,capacity=2,sample-rate=16000,durationUs=8640000,channel-count=1,mime=音频/MP4a-latm,isDMCMMExtractor=1}
另一个是{max-input-size=798,durationUs=8640000,channel-count=1,mime=音频/MP4a-latm,csd-0=java.nio.ByteArrayBufferposition=0,limit=2,capacity=2,采样率=16000}
因此,原始音频只有一个声道,编码器配置了一个声道too.But,编码器以两个声道的方式输出。
这与isDMCMMExtractor标志有关系吗?
救命!救命!@fadden
发布于 2014-12-18 17:42:49
首先,这个问题很难理解--列出的两个MediaFormat内容都显示了channel-count=1,所以对问题本身的实际解释很少,只对周围的其他细节进行了解释。
然而,在一些android版本中的软件AAC解码器(如果我没记错的话是4.1,也可能是4.2 )将单声道AAC解码成立体声-不确定一些硬件AAC解码器是否也做同样的事情。你可以争论这是一个bug还是一个意想不到的行为,但这是你必须接受的。在解码器返回立体声数据的情况下,即使输入是单声道,两个立体声通道将具有相同的(单声道)内容。
因此,基本上,您必须准备好处理此问题-要么将实际格式信息从解码器(而不是从MediaExtractor)传递给使用数据的人(例如,将音频输出重新配置为立体声),要么准备将立体声重新混合为单声道,如果您确实需要单声道格式的输出。
https://stackoverflow.com/questions/27526267
复制相似问题