3

我正在创建一个应用程序来检测通过麦克风播放的声音频率。分析在 AsyncTask 中完成。当我尝试一个音符时它会起作用。

但是,当我尝试分析来自不同吉他弦的 6 个音符时,一个接一个(中间有大约一秒钟的延迟),它可能只捕捉到一个。

这是我得到的一些 LogCat 输出:

11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): [doRouting]sndDevice=0,mCurSndDevice=-1
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): [SKW]do_route_audio_rpc(0, 1, 0)
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): msm72xx_enable_audpp: 0x0000
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): [doRouting]sndDevice=0,mCurSndDevice=0
11-22 19:50:30.523: ERROR/AudioHardwareMSM72XX(1296): Cannot open /dev/msm_pcm_in errno: 16
11-22 19:50:30.533: ERROR/AudioRecord(23241): Could not get audio input for record source 1
11-22 19:50:30.533: ERROR/AudioRecord-JNI(23241): Error creating AudioRecord instance: initialization check failed.
11-22 19:50:30.533: ERROR/AudioRecord-Java(23241): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object.

我删除了所有重复的内容。

这是我班的主要内容:

static AudioRecord recorder;
static short[] audioData;
static int bufferSize;
static int samplerate = 8000;         
static boolean recorded = false;

@Override
protected Integer doInBackground(params) {

bufferSize= AudioRecord.getMinBufferSize(samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT)*2; 

recorder = new AudioRecord (AudioSource.MIC,samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT,bufferSize); 

    audioData = new short [bufferSize]; //short array that pcm data is put into.

    int recordingLoops = 0;
    while (recordingLoops < 4 || recorded) {  //loop until recording is running

    if (recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED)
        if(recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED)
              recorder.startRecording();                     
        else {         
           recorder.read(audioData,0,bufferSize); 

           getFrequencyFromAudiodata(audioData);

           recorded = true;
             }        
    recordingLoops++;  
}

    if (recorder.getState()==android.media.AudioRecord.RECORDSTATE_RECORDING) 
    {
        killRecorder();
    }

    return 1;
}

你们知道发生了什么吗?我做了一些环顾四周,但我似乎只是遇到有人说 Android 是“充满错误”。

任何帮助将不胜感激。

谢谢,本

4

2 回答 2

4

答案就在于此:

while (recordingLoops < 4 || recorded) 

我将其更改为:

while (!recorded) 

并且仅当音频数据数组被充分填充时才将记录器设置为 true。这意味着它将循环直到完美。谢谢你的帮助戴夫!

于 2011-11-23T18:34:54.083 回答
2

您可能会看这个答案,看起来处理与 AudioRecord 相关的线程时有一些想法:

Android AudioRecord 类 - 快速处理现场麦克风音频,设置回调函数

于 2011-11-22T20:27:52.683 回答