我正在尝试设置录音机,但不断收到特定错误,但无法弄清楚原因。 在我的代码中,我已经使用 startrecording() 方法前后的日志检查了录音机所处的状态。
ar = new AudioRecord(audiosource, sampleRate, channelConfiguration,
audioEncoding, buffersizebytes);
Log.d("info", "ar.getState() before = " + String.valueOf(ar.getState()));
ar.startRecording();
Log.d("info", "ar.getState() after = " +String.valueOf(ar.getState()));
当我运行该应用程序时,我在logcat中收到这些消息。
D/info﹕ ar.getState() before = 1
E/AudioRecord﹕ start() status -38
D/info﹕ ar.getState() after = 1
从我在文档中读到的内容来看,状态 1 可以对应于RECORDSTATE_STOPPED中的录音机,或者STATE_INITIALIZED状态在调用 startRecording() 时这两个都不应该引起问题。
状态 -38 我相信是/* 函数未实现的 errno.h 代码 */是指 startRecording() 方法还是在错误中指出的 start() 函数,它不是 AudioRecorder 类的方法。
我已经尝试了多种方法来确保调用 release() 函数,所以我认为这不是这里的问题。
任何帮助将不胜感激。
所以这就是我认为我需要做的,应该在 AudioRecorder 文档中真正讨论,但这个类似的问题让我找到了答案 AudioRecord 对象未初始化基本上你想做的是遍历所有配置,并针对AudioRecord.ERROR_BAD_VALUE检查尝试每个配置,因为我计划使用长度必须是 2 的幂的 fft,如果其他人遇到类似的情况,我会添加一点
,如果部分public AudioRecord findAudioRecord() {
for (int rate : mSampleRates) {
for (short audioFormat : new short[]{AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT}) {
for (short channelConfig : new short[]{AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO}) {
try {
//Log.d("audioSetup", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig);
int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
if (bufferSize > 0 && bufferSize <= 256){
bufferSize = 256;
}else if (bufferSize > 256 && bufferSize <= 512){
bufferSize = 512;
}else if (bufferSize > 512 && bufferSize <= 1024){
bufferSize = 1024;
}else if (bufferSize > 1024 && bufferSize <= 2048){
bufferSize = 2048;
}else if (bufferSize > 2048 && bufferSize <= 4096){
bufferSize = 4096;
}else if (bufferSize > 4096 && bufferSize <= 8192){
bufferSize = 8192;
}else if (bufferSize > 8192 && bufferSize <= 16384){
bufferSize = 16384;
}else{
bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
}
if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
// check if we can instantiate and have a success
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize);
if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
Log.d("found", "rate: " + rate + " channelConfig: " + channelConfig + " bufferSize: " + bufferSize + " audioFormat: " + audioFormat);
sampleRate = rate;
channelConfiguration = channelConfig;
audioEncoding = audioFormat;
buffersizebytes = bufferSize;
return recorder;
}
}
} catch (Exception e) {
Log.d("audioSetup", rate + "Exception, keep trying.", e);
e.printStackTrace();
}
}
}
}
return null;
}
似乎工作得很好。 感谢您的帮助。