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

Android AudioTrack出现releaseBuffer: mUnreleased out of range崩溃原因求解

问题根因
  • 采样率不匹配
    录音端配置的采样率为16000,播放端直接调用AudioTrack.getNativeOutputSampleRate获取系统原生采样率(通常为44100或48000)作为播放采样率,两端参数不匹配会导致播放速度异常、出现杂音。
  • 编码格式不匹配
    录音端使用AudioFormat.ENCODING_PCM_16BIT位宽编码,每个采样点占2字节;播放端配置为AudioFormat.ENCODING_PCM_8BIT,每个采样点仅占1字节,位宽不一致导致PCM数据解析完全错误,是杂音的核心诱因。
  • 缓冲区配置错误
    你错误地将获取到的系统采样率数值直接作为AudioTrack构造的缓冲区大小参数传入,实际缓冲区大小需要调用AudioTrack.getMinBufferSize传入对应采样率、声道、编码格式计算得到合理值,非法的缓冲区大小会触发内存越界,就是你看到的releaseBuffer: mUnreleased out of range报错的直接原因,最终引发SIGABRT崩溃。
修复方案

播放端的音频参数必须和录音端完全对齐,修正后的AudioTrack初始化代码如下:

// 和AudioRecord端参数完全一致
private val SAMPLER = 16000
private val CHANNEL_CONFIG: Int = AudioFormat.CHANNEL_OUT_MONO
private val AUDIO_FORMAT: Int = AudioFormat.ENCODING_PCM_16BIT
// 计算合法的最小缓冲区大小
private var BUFFER_SIZE = AudioTrack.getMinBufferSize(SAMPLER, CHANNEL_CONFIG, AUDIO_FORMAT)

val attribBuilder = AudioAttributes.Builder()
attribBuilder.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
attribBuilder.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
val attributes = attribBuilder.build()

val afBuilder = AudioFormat.Builder()
afBuilder.setChannelMask(CHANNEL_CONFIG)
afBuilder.setEncoding(AUDIO_FORMAT)
afBuilder.setSampleRate(SAMPLER)
val format = afBuilder.build()

audioTrack = AudioTrack(
    attributes,
    format,
    BUFFER_SIZE,
    AudioTrack.MODE_STREAM,
    AudioManager.AUDIO_SESSION_ID_GENERATE
)
额外注意

确保WebSocket传输过程中没有丢包、音频分片拼接逻辑正常,写入AudioTrack的数据长度不要超过单次允许的缓冲区大小。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 16:54:00