Android使用MediaCodec编码AAC音频出现BufferOverflowException问题求助
问题核心原因
你碰到的Buffer溢出本质是解码器输出的6声道PCM帧大小,远大于编码器分配的输入Buffer上限,从你的日志可以看到:
- 解码器输出PCM是48000采样率、6声道、PCM16编码,单帧大小为
1024采样点 * 2字节/采样 * 6声道 = 12288字节,和你打印的audioDecoderOutputBufferInfo.size=12288完全匹配 - 编码器分配的输入Buffer上限只有4096字节,刚好是2声道下的单帧PCM大小(
1024*2*2=4096),说明编码器实际只接受2声道输入,你透传的6声道参数没有生效
解决方向
优先做多声道PCM下混处理
绝大多数Android设备的硬件AAC编码器仅支持最大2声道输入,你直接透传输入源的6声道参数给编码器,编码器会自动降级为2声道,但是不会主动告知上层,也不会自动处理PCM的声道转换,需要你自己实现5.1声道转双声道的下混逻辑,把转换后的2声道PCM喂给编码器,刚好适配4096字节的输入Buffer大小。显式配置编码器的最大输入Buffer大小
如果你有保留多声道编码的需求,首先要确认当前设备的AAC编码器确实支持5.1声道编码,确认支持后给输出音频格式显式设置KEY_MAX_INPUT_SIZE:
// 6声道、48000采样率、PCM16的最大帧大小为12288,预留20%冗余更稳妥 outputAudioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 15360);
配置后编码器会分配足够大的输入Buffer,避免溢出。
- 增加Buffer大小校验逻辑
每次调用encoderInputBuffer.put(decoderOutputBuffer)之前,先判断两者的可用大小:
if (encoderInputBuffer.remaining() >= decoderOutputBuffer.remaining()) { encoderInputBuffer.put(decoderOutputBuffer); } else { // 要么做PCM分片写入,要么先处理声道转换后再写入 }
避免极端场景下的溢出问题。
- 适配解码器输出格式变更
收到解码器的output format changed回调时,要同步更新后续PCM处理的参数计算逻辑,不要一直复用初始的声道数、采样率参数。
内容的提问来源于stack exchange,提问作者Yeamin Chowdhury
相关产品推荐
相关产品推荐

