前面使用 AudioTrack 播放音频数据,在创建 AudioTrack 时其中有一个是缓冲区大小的参数,通过 AudioTrack.getMinBufferSize() 获取最小缓冲区。这一节我们就来分析下缓冲区大小参数的作用。
一、最小缓冲区
最小缓冲区是声音能正常播放的最低保障。如果数据缓冲区分配得过小,那么播放声音会频繁遭遇 underrun,underrun 是指生产者(AudioTrack)提供数据的速度跟不上消费者(AudioFlinger::PlaybackThread)消耗数据的速度,反映到现实的后果就是声音断续卡顿,严重影响听觉体验。
1、获取放法
AudioTrack.getMinBufferSize(48000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
从函数参数来看,返回值取决于采样率、采样深度、声道数这三个属性。
2、AudioTrack
源码位置:/frameworks/base/media/java/android/media/AudioTrack.java
getMinBufferSize
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) {int channelCount = 0;switch(channelConfig) {case AudioFormat.CHANNEL_OUT_MONO:case AudioFormat.CHANN