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
相关产品推荐
相关产品推荐

