我正在尝试缓冲音频数据以分析分贝水平。
我使用AudioRecord类,因为它允许从缓冲区处理数据,而不需要将它们存储在文件中。
我正在使用
<uses-permission android:name="ANDROID.PERMISSION.RECORD_AUDIO" />
许可。Edit:这是错误的!
我用
从我在onStart()
的主要活动中启动它作为服务Intent intent = new Intent(this, Audio2.class);
startService(intent);
业务在onStartCommand(...)
期间呼叫findAudioRecord()
。
private int[] sampleRates = new int[] { 44_100, 22_050, 11_025, 8_000 };
private short[] audioFormats = new short[] { AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_PCM_8BIT };
private short[] channelConfigs = new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO };
public AudioRecord findAudioRecord() {
for (int rate : sampleRates){
for (short audioFormat : audioFormats){
for (short channelConfig : channelConfigs){
try {
Log.d(TAG, "Attempting rate " + rate + "Hz, " + audioFormat + " bits, channel: " + channelConfig);
bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize*10);
if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
return recorder;
} else {
recorder.release();
}
}
} catch (Exception e) {
Log.e(TAG, rate + "Exception, keep trying.",e);
}
}
}
}
Log.wtf(TAG, "No working configuration found!");
return null;
}
这总是返回null。我得到错误:
E/AudioRecord﹕ AudioFlinger could not create record track, status: -1
E/AudioRecord-JNI﹕ Error creating AudioRecord instance: initialization check failed.
E/AudioRecord-Java﹕ android.media.AudioRecord Error code -20 when initializing native AudioRecord object.
我用的是三星Galaxy S4。
我的尝试没有成功:
- 多次重启设备
- 在GT-S6790N上进行了测试
- 在模拟设备上尝试过
- AudioRecord对象未初始化尝试了这篇文章中的所有内容(以及任何形式的相关文章)
经过几个小时的努力,我终于找到了问题所在。如果您使用Android Studio的自动完成功能并键入
<uses-permission android:name="RECORD_AUDIO" />
后跟回车,Android Studio将会填充
<uses-permission android:name="ANDROID.PERMISSION.RECORD_AUDIO" />
然而,这不起作用,因为大小写显然很重要。没有警告,什么都没有。在我把它改成
之后<uses-permission android:name="android.permission.RECORD_AUDIO" />