2011-11-22 147 views
3

我正在創建一個應用程序,檢測通過麥克風播放聲音的頻率。 分析在AsyncTask中完成。它在我嘗試一個音符時起作用。Android的audiorecord實例失敗

但是,當我試着分析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. 

我刪除的任何重複你的所有。

這裏是我班的JIST:

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

答案在這個居士:

while (recordingLoops < 4 || recorded) 

我將其更改爲:

while (!recorded) 

並且只有當音頻數據陣列被充分填充時纔將記錄器設置爲真。 這意味着它會循環直到完美。感謝您的幫助戴夫!