我有一个串器(Xoom的,Xyboard等)的作品完美的应用程序,但失败了,在这条线在Galaxy 10.1
mrec.setAudioSamplingRate(44100);
当我注释此行了,一切正常顺顺当当。 (我不知道什么评分默认使用)。 我的猜测是设备不支持该特定的采样速率,但我没有看到在文档的什么方法什么对象的我可以看一下,找出所支持的采样率是什么。
所有的帮助表示赞赏。
我有一个串器(Xoom的,Xyboard等)的作品完美的应用程序,但失败了,在这条线在Galaxy 10.1
mrec.setAudioSamplingRate(44100);
当我注释此行了,一切正常顺顺当当。 (我不知道什么评分默认使用)。 我的猜测是设备不支持该特定的采样速率,但我没有看到在文档的什么方法什么对象的我可以看一下,找出所支持的采样率是什么。
所有的帮助表示赞赏。
是的,Android不提供一个明确的方法来检查,但有一个变通与AudioRecord类的getMinBufferSize功能。
public void getValidSampleRates() {
for (int rate : new int[] {8000, 11025, 16000, 22050, 44100}) { // add the rates you wish to check against
int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
if (bufferSize > 0) {
// buffer size is valid, Sample rate supported
}
}
}
如果选中的功能描述,它会返回一个负值,如果不支持输入的参数之一。 假设你输入所有其他投入是有效的,我们希望它返回一个负的缓冲区大小,如果不支持的采样率。
然而,有些人报告说,它正返回即使是不支持的采样率,从而额外的检查,可以通过尝试初始化完成的AudioRecord对象 ,如果它认为它不能处理与采样率,这将抛出IllegalArgumentException。
最后,他们没有提供担保支票,但同时使用会增加你获得支持的一个机会。
大多数时候,对我来说当然的44100和48000的工作,从设备到不同的设备。
Android有AudioManager.getProperty()
函数来获取最小缓冲器大小,并获得用于音频记录和回放的优选采样率。 但是,是的,当然, AudioManager.getProperty()
不提供API级<17。 下面是关于如何使用该API的示例代码示例。
// To get preferred buffer size and sampling rate.
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
String rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
String size = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
Log.d("Buffer Size and sample rate", "Size :" + size + " & Rate: " + rate);
虽然它的一个迟到的回答,我想这可能是有用的。
因为这也不是绝对的,这并不使用缓冲区大小作为测试。 我测试说我自己的华硕记事解决方案和缓冲区的大小测试将始终返回一个正整数,给误报。
第一种方法将测试一个通过采样率和返回true或false取决于样品率是否由设备或不支持的。 第二种方法将遍历通过给定的列表,并返回的最大有效采样率(先入是有效的列表) - 可以为其他启发式来容易地改变。
boolean validSampleRate(int sample_rate) {
AudioRecord recorder = null;
try {
int bufferSize = AudioRecord.getMinBufferSize(sample_rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sample_rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
} catch(IllegalArgumentException e) {
return false; // cannot sample at this rate
} finally {
if(recorder != null)
recorder.release(); // release resources to prevent a memory leak
}
return true; // if nothing has been returned yet, then we must be able to sample at this rate!
}
int maxValidSampleRate() {
int[] sample_rates = new int[]{44100, 16000}; // pad list with other samples rates you want to test for
for(int sample_rate : sample_rates) {
if(validSampleRate(sample_rate))
return sample_rate; // this rate is supported, so return it!
}
return -1; // no valid sample rate
}