同设备同参数下AudioTrack与AudioRecord的getMinBufferSize返回值是否一致?
核心结论
Android官方没有给出两个方法返回值一致的任何保证,绝对不可以直接假设二者返回值相同来配置共享缓冲区。
底层逻辑差异说明
- 两个API面向的音频链路完全独立:
AudioRecord.getMinBufferSize()计算的是音频采集链路的最小可用缓冲区,数值由底层录音硬件的DMA缓冲区大小、内核采集队列的调度周期共同决定AudioTrack.getMinBufferSize()计算的是音频播放链路的最小可用缓冲区,数值由播放硬件缓冲区、系统混音服务的调度周期共同决定
- 你在两台设备上测试得到相同返回值仅为厂商实现的巧合,目前已有大量实测案例显示,部分定制ROM、低端入门设备上,相同参数下二者的返回值差异可达2~3倍,直接复用会导致录音丢帧、播放断音的稳定性问题。
推荐的统一配置方案
如果你的录播场景需要使用统一的缓冲区配置,可按以下逻辑处理:
- 用相同的采样率、通道配置、音频格式参数,分别调用两个
getMinBufferSize方法,拿到两个返回值 - 先校验返回值合法性:如果返回值为
ERROR_BAD_VALUE(参数不被设备支持)或ERROR(接口初始化失败),先降级到设备通用兼容参数(44100Hz采样率、立体声、16bit PCM)后重新计算 - 取两个合法返回值的最大值作为缓冲区基准大小,额外增加10%~20%的冗余量应对系统调度波动,最终值作为统一的缓冲区配置即可
内容的提问来源于stack exchange,提问作者Nerdy Bunz
相关产品推荐
相关产品推荐

