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

Android 使用mediacodec的Aac编码器初始化为一个通道,但输出为两个通道,android,audio,aac,android-mediacodec,Android,Audio,Aac,Android 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.setInt

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提取的格式在两种设备上不同:

正常的是 {最大输入大小=1572864,aac配置文件=2, csd-0=java.nio.ByteArrayBuffer[position=0,limit=2,capacity=2],采样率=16000, 持续时间=8640000,通道计数=1,mime=音频/mp4a latm,ISDMCMEXTRACTOR=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],采样率=16000}

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

这与ISDMECxtractor标志有关系吗

救命啊!救命啊!
@fadden首先,这个问题很难理解-列出的MediaFormat内容都显示了
频道计数=1
,因此对问题本身的实际解释很少,只有对其他周围细节的解释

然而,一些android版本的软件AAC解码器(如果我没记错的话,可能是4.1,也可能是4.2)会将单声道AAC解码为立体声——不确定一些硬件AAC解码器是否也会这样做。你可以争论这是一个bug还是一个意外的行为,但这是你必须忍受的。如果即使输入是单声道,解码器仍返回立体声数据,则两个立体声通道将具有相同的(单声道)内容


因此,基本上,您必须准备好处理此问题-要么将实际格式信息从解码器(而不是从MediaExtractor)传递给使用数据的人(例如,将音频输出重新配置为立体声),如果你真的需要以单声道格式输出,也可以准备将立体声混入单声道。

你在使用什么设备?我在使用小米米3。我发现了更多细节。编码器输入演示文稿0时,输出演示文稿0和64000。输入演示文稿64000时,输出演示文稿64000和128000,等等。但编码器在使用presentionUs对录音机的缓冲区进行编码时执行正常。它们以相同的方式初始化,但执行非常不同。非常奇怪!第二个设备是什么?第二个设备是三星G7106。你好,马龙。你知道吗?是的,它看起来很奇怪。当它对用单声道格式初始化的录音机录制的缓冲区进行编码时,它会正常工作。当用两个声道解码音频时,它也会正常工作,但它会输出单调的表示,例如0,36550,72332等。那么我的问题是如何判断解码器将其解码为单声道还是立体声?我可以通过简单地丢弃重复的演示数据包来处理它吗?我必须处理异常情况,但害怕影响正常人的行为。如果解码器将其解码为立体声,您应该能够在MediaFormat中看到由
MediaCodec.getOutputFormat()
返回的格式(在
INFO\u OUTPUT\u format\u更改后)。但您似乎在谈论解码器返回的时间戳,这将是一个完全不同的问题。在这种情况下,请检查您实际从
MediaExtractor
获得的数据包-它们与另一台工作设备上的数据包相同,还是重复?谢谢,mstorsjo。这是关键。解码器确实将单声道解码为立体声,并且在INFO_OUTPUT_FORMAT_change事件后返回的mediaformat证明了这一点。因此,我在事件后配置了编码器,它成功地工作了。