【发布时间】:2023-03-13 18:30:01
【问题描述】:
我正在尝试实现一个应用程序,它可以监听麦克风输入(特别是呼吸),并根据它呈现数据。我正在使用 Android 类 AudioRecord,在尝试实例化 AudioRecord 时出现三个错误。
AudioRecord: AudioFlinger could not create record track, status: -1
AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -1.
android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
我发现了这个很棒的帖子:AudioRecord object not initializing
我从已接受的答案中借用了代码,该代码尝试了所有采样率、音频格式和通道配置以尝试解决问题,但没有帮助,我在所有设置中都出现上述错误。根据线程中的一个答案,我还在几个地方添加了对 AudioRecord.release() 的调用,但没有任何区别。
这是我的代码:
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;
public class SoundMeter {
private AudioRecord ar = null;
private int minSize;
private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 32000, 44100 };
public boolean start() {
ar = findAudioRecord();
if(ar != null){
ar.startRecording();
return true;
}
else{
Log.e("SoundMeter", "ERROR, could not create audio recorder");
return false;
}
}
public void stop() {
if (ar != null) {
ar.stop();
ar.release();
}
}
public double getAmplitude() {
short[] buffer = new short[minSize];
ar.read(buffer, 0, minSize);
int max = 0;
for (short s : buffer)
{
if (Math.abs(s) > max)
{
max = Math.abs(s);
}
}
return max;
}
public AudioRecord findAudioRecord() {
for (int rate : mSampleRates) {
for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_PCM_FLOAT }) {
for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) {
try {
Log.d("SoundMeter", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig);
int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
// check if we can instantiate and have a success
Log.d("SoundMeter", "Found a supported bufferSize, attempting to instantiate");
AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize);
if (recorder.getState() == AudioRecord.STATE_INITIALIZED){
minSize = bufferSize;
return recorder;
}
else
recorder.release();
}
} catch (Exception e) {
Log.e("SoundMeter", rate + " Exception, keep trying.", e);
}
}
}
}
return null;
}
}
我也添加了
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
标记到我的清单文件,根据上述线程中的其他答案之一,作为清单标记的子级和应用程序标记的兄弟级。添加此标签后,我已经重建了项目。
这些是我在谷歌上搜索问题时找到的解决方案,但不幸的是,它们似乎不适合我。 我正在我的 Nexus 5 手机(不是模拟器)上进行调试。这些错误在调用 AudioRecord 的构造函数时出现。我已经重新启动了几次手机以尝试释放麦克风,但无济于事。该项目基于Android 4.4,我的手机目前运行的是Android 6.0.1。
非常感谢一些关于我还可以尝试什么、我可能会错过什么的提示。谢谢!
【问题讨论】:
标签: java android multithreading audiorecord