我正在用薑餅硝基高清發展。我想錄制音頻,並在調用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的症狀?
可能有用,我會盡快嘗試。 – 2013-03-26 11:51:56
那麼,那個幫助。系統不再掛起,因爲我將.3gp更改爲.mp4,將其從16更改爲96000.但是,由於無法停止錄製,我無法獲取記錄的臨時文件,因此它似乎掛在代碼中的其他位置。當我找到幾分鐘時,還有別的東西可以探索。 – 2013-03-26 19:17:33
好的,非常感謝!現在它工作正常(其他問題,但我會打開其他問題)。我用'recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);'我沒有指定編碼比特率,但用'Recorder.setAudioSamplingRate(8000);'指定了採樣率。 – 2013-03-27 03:27:29