在創(chuàng)建audiotrack中傳入的采樣率通道和audioFormat知押,會共同決定minBufferSize肥橙。同樣會在getMinBufferSize()方法中check,源碼API23.AudioTrack的構(gòu)造函數(shù)中也會對相應(yīng)參數(shù)校驗秸侣,但這里只看getMinBufferSize()方法存筏。
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) {
int channelCount = 0;
switch(channelConfig) {
case AudioFormat.CHANNEL_OUT_MONO:
case AudioFormat.CHANNEL_CONFIGURATION_MONO:
channelCount = 1;
break;
case AudioFormat.CHANNEL_OUT_STEREO:
case AudioFormat.CHANNEL_CONFIGURATION_STEREO:
channelCount = 2;
break;
default:
if (!isMultichannelConfigSupported(channelConfig)) {
loge("getMinBufferSize(): Invalid channel configuration.");
return ERROR_BAD_VALUE;
} else {
channelCount = AudioFormat.channelCountFromOutChannelMask(channelConfig);
}
}
if (!AudioFormat.isPublicEncoding(audioFormat)) {
loge("getMinBufferSize(): Invalid audio format.");
return ERROR_BAD_VALUE;
}
// sample rate, note these values are subject to change
if ( (sampleRateInHz < SAMPLE_RATE_HZ_MIN) || (sampleRateInHz > SAMPLE_RATE_HZ_MAX) ) {
loge("getMinBufferSize(): " + sampleRateInHz + " Hz is not a supported sample rate.");
return ERROR_BAD_VALUE;
}
int size = native_get_min_buff_size(sampleRateInHz, channelCount, audioFormat);
if (size <= 0) {
loge("getMinBufferSize(): error querying hardware");
return ERROR;
}
else {
return size;
}
}
通道數(shù)
除了單聲道,就是立體聲了味榛,channelCount不是1就是2椭坚。
此外還有多聲道的支持判斷支持新設(shè)備,目前還沒有詳細(xì)學(xué)習(xí)搏色。使用其他的channelConfig有什么用處還不了解善茎。通過比對發(fā)現(xiàn),其他channelConfig應(yīng)該算是新特性频轿,至少在api15里面是沒有的垂涯。所以至少使用其中的一種CHANNEL_OUT_MONO,CHANNEL_CONFIGURATION_MONO航邢,CHANNEL_OUT_STEREO耕赘,CHANNEL_CONFIGURATION_STEREO。
sampleRateInHz
一個范圍限制膳殷。 api23里顯示的是從4000到192000操骡。老sdk中沒有這么寬的支持,api15中,是4000到48000,册招〔砑ぃ考慮到兼容性,采樣率還是盡量在4000-48000.具體選擇什么樣的采樣率還要看需求是掰,如果處理的是人聲虑鼎,人耳可以聽見的范圍在20-20k,根據(jù)耐奎斯特定律冀惭,至少也得是40k震叙。如果多音軌合成,盡量還是相同的采樣率散休,目前對android上重采樣的實現(xiàn)還沒有細(xì)研究媒楼。
/** Minimum value for sample rate */
private static final int SAMPLE_RATE_HZ_MIN = 4000;
/** Maximum value for sample rate */
private static final int SAMPLE_RATE_HZ_MAX = 192000;
audioFormate
這里調(diào)用了isPublicEncoding()方法,里面做了相應(yīng)判斷戚丸,但是要注意這里引用的是API23的代碼划址。
public static boolean isPublicEncoding(int audioFormat)
{
switch (audioFormat) {
case ENCODING_PCM_8BIT:
case ENCODING_PCM_16BIT:
case ENCODING_PCM_FLOAT:
case ENCODING_AC3:
case ENCODING_E_AC3:
case ENCODING_DTS:
case ENCODING_DTS_HD:
return true;
default:
return false;
}
}
雖然AudioFormate中定義了很多 ENCODING類型,允許的類型有限限府。目前看到的類型中夺颤,除了PCM_8BIT和PCM_16BIT,還有其他胁勺。但是老的sdk中僅允許PCM_8BIT和PCM_16BIT世澜,而且。署穗。寥裂。。
多看一眼注釋
// These values must be kept in sync with core/jni/android_media_AudioFormat.h
// Also sync av/services/audiopolicy/managerdefault/ConfigParsingUtils.h
/** Audio data format: PCM 16 bit per sample. Guaranteed to be supported by devices. */
public static final int ENCODING_PCM_16BIT = 2;
/** Audio data format: PCM 8 bit per sample. Not guaranteed to be supported by devices. */
public static final int ENCODING_PCM_8BIT = 3;
ENCODING_PCM_8BIT 并不保證支持案疲,所以還是優(yōu)選PCM_16BIT封恰。