2013-03-24 57 views
0

我正在用薑餅硝基高清發展。我想錄制音頻,並在調用MediaRecorder.stop()時遇到無限懸掛。如何在Android上錄製音頻而不會崩潰?

我知道我的手機可以錄製聲音,因爲我有一個應用程序可以完全做到。

我從Deitel等人那裏讀了一本書「Android for programmers」。在第16章中有一個VoiceRecorder的例子。一切似乎都很好,但是當它調用MediaRecorder.stop()時,該應用程序永遠掛起。此外,該資源沒有發佈,我必須重新啓動手機才能發佈。

這裏就是調用完成代碼的一部分(見Deitel公司等,「機器人的程序員」,Prentice Hall出版社,2012,第16章):

// starts/stops a recording 
OnCheckedChangeListener recordButtonListener = 
    new OnCheckedChangeListener() 
    { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, 
     boolean isChecked) 
    { 
     if (isChecked) 
     { 
      visualizer.clear(); // clear visualizer for next recording 
      saveButton.setEnabled(false); // disable saveButton 
      deleteButton.setEnabled(false); // disable deleteButton 
      viewSavedRecordingsButton.setEnabled(false); // disable 

      // create MediaRecorder and configure recording options 
      if (recorder == null) 
       recorder = new MediaRecorder(); // create MediaRecorder 
      recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      recorder.setOutputFormat(
       MediaRecorder.OutputFormat.THREE_GPP); 
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
      recorder.setAudioEncodingBitRate(16); 
      recorder.setAudioSamplingRate(44100); 

      try 
      { 
       // create temporary file to store recording 
       File tempFile = File.createTempFile(
       "VoiceRecorder", ".3gp", getExternalFilesDir(null)); 

       // store File as tag for saveButton and deleteButton 
       saveButton.setTag(tempFile); 
       deleteButton.setTag(tempFile); 

       // set the MediaRecorder's output file 
       recorder.setOutputFile(tempFile.getAbsolutePath()); 
       recorder.prepare(); // prepare to record 
       recorder.start(); // start recording 
       recording = true; // we are currently recording 
       handler.post(updateVisualizer); // start updating view 
      } // end try 
      catch (IllegalStateException e) 
      { 
       Log.e(TAG, e.toString()); 
      } // end catch 
      catch (IOException e) 
      { 
       Log.e(TAG, e.toString()); 
      } // end catch    
     } // end if 
     else 
     { 
      recorder.stop(); // stop recording 
      recorder.reset(); // reset the MediaRecorder 
      recording = false; // we are no longer recording 
      saveButton.setEnabled(true); // enable saveButton 
      deleteButton.setEnabled(true); // enable deleteButton 
      recordButton.setEnabled(false); // disable recordButton 
     } // end else 
    } // end method onCheckedChanged 
    }; // end OnCheckedChangedListener 

在調試會話, 「else」作用域被輸入,但它掛在第一個(stop())行。

我再說一遍,我知道手機和它的操作系統是正確的,因爲另一個應用程序正常工作。那麼,你有沒有關於如何解決這個問題的想法,一個可能的工作?

謝謝!

編輯當錄音機啓動()時,會有一個處理程序在每50ms執行一次,以顯示聲音幅度圖。方法recorder.getMaxAmplitude()總是返回0.也許這是一個嚴重初始化MediaRecorder的症狀?

回答

2

setAudioEncodingBitRate的參數()可能太低。

what is good setAudioEncodingBitRate on record voice

希望這是幫助。

+0

可能有用,我會盡快嘗試。 – 2013-03-26 11:51:56

+0

那麼,那個幫助。系統不再掛起,因爲我將.3gp更改爲.mp4,將其從16更改爲96000.但是,由於無法停止錄製,我無法獲取記錄的臨時文件,因此它似乎掛在代碼中的其他位置。當我找到幾分鐘時,還有別的東西可以探索。 – 2013-03-26 19:17:33

+0

好的,非常感謝!現在它工作正常(其他問題,但我會打開其他問題)。我用'recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);'我沒有指定編碼比特率,但用'Recorder.setAudioSamplingRate(8000);'指定了採樣率。 – 2013-03-27 03:27:29

0

您可以在該位置設置空記錄器。如果輸入isChecked的其他情況,則不會創建新的MediaRecorder()。

因此,兩件事情:

文檔指出,如果您調用stop()開始之前,你會拋出RuntimeException如果你不記錄任何你會拋出IllegalStateException的API。

檢查調用停止前記錄:

if (recorder != null) { 
    recorder.stop(); 
    // some recorder stuff here 
} 
+0

那麼,記錄器不應該爲null,因爲它以前在「if(isChecked)」中啓動。在這個範圍內,如果它是空的,它就會被立即執行。那麼它可能會在start()和stop()之間丟失(變爲空)嗎? – 2013-03-24 04:10:05