You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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声道参数没有生效

解决方向

  1. 优先做多声道PCM下混处理
    绝大多数Android设备的硬件AAC编码器仅支持最大2声道输入,你直接透传输入源的6声道参数给编码器,编码器会自动降级为2声道,但是不会主动告知上层,也不会自动处理PCM的声道转换,需要你自己实现5.1声道转双声道的下混逻辑,把转换后的2声道PCM喂给编码器,刚好适配4096字节的输入Buffer大小。

  2. 显式配置编码器的最大输入Buffer大小
    如果你有保留多声道编码的需求,首先要确认当前设备的AAC编码器确实支持5.1声道编码,确认支持后给输出音频格式显式设置KEY_MAX_INPUT_SIZE:

// 6声道、48000采样率、PCM16的最大帧大小为12288,预留20%冗余更稳妥
outputAudioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 15360);

配置后编码器会分配足够大的输入Buffer,避免溢出。

  1. 增加Buffer大小校验逻辑
    每次调用encoderInputBuffer.put(decoderOutputBuffer)之前,先判断两者的可用大小:
if (encoderInputBuffer.remaining() >= decoderOutputBuffer.remaining()) {
    encoderInputBuffer.put(decoderOutputBuffer);
} else {
    // 要么做PCM分片写入,要么先处理声道转换后再写入
}

避免极端场景下的溢出问题。

  1. 适配解码器输出格式变更
    收到解码器的output format changed回调时,要同步更新后续PCM处理的参数计算逻辑,不要一直复用初始的声道数、采样率参数。

内容的提问来源于stack exchange,提问作者Yeamin Chowdhury

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:36:04