MediaRecorder類是Android sdk提供的一個專門用於音視頻錄製,通常利用手機麥克風採集音頻和攝像頭採集圖像.這個類是屬於簡單的音頻錄製類,錄製音頻簡單容易可是對音頻流的控制也比較弱,這篇博客將只介紹音頻的錄製android
<!--音頻錄製權限 --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!--讀取和寫入存儲權限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
注意!在Android 5.0後須要動態受權網絡
private MediaRecorder mMediaRecorder; private void initMediaRecorer(){ mMediaRecorder = new MediaRecorder(); }
沒啥好說的,就是new一個MediaRecorderide
private void configMediaRecorer(){ File demoAmrFile = new File(getExternalCacheDir(),"demo.amr"); if (demoAmrFile.exists()){ demoAmrFile.delete(); } mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//音頻錄入源 mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);//錄製音頻的輸出格式 mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//錄製音頻的編碼格式 目前手機設備上可能就AMR_NB有用 mMediaRecorder.setOutputFile(demoAmrFile.getAbsolutePath());//音頻輸出路徑和文件名稱 注意!這個設置是有順序要求的,必需是上面編碼格式設置完成後才能,寫到前面會報錯 mMediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() { @Override public void onError(MediaRecorder mr, int what, int extra) { //異常監聽 mMediaRecorder.stop();//暫停 mMediaRecorder.release();//釋放資源 mMediaRecorder = null; } }); mMediaRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {//信息回調 @Override public void onInfo(MediaRecorder mr, int what, int extra) { } }); }
注意!每一次錄製音頻前都須要配置一次.假設你錄製暫停後,想從新錄製新音頻也須要從新執行一次這個方法,從新配置MediaRecorder!ui
再次注意! 配置參數是有順序要求的的,沒有按照順序配置會報錯,通常順序是 > 配置音頻源 > 配置音頻輸出格式 和 編碼格式 > 配置其餘參數(例如:文件大小限制/錄製時間限制/音頻比特率)> 配置文件保存路徑 > 配置各類監聽.
編碼
private void startRecorer(){ if (mMediaRecorder != null){ try { mMediaRecorder.prepare();//準備 mMediaRecorder.start();//開啓 } catch (IOException e) { e.printStackTrace(); } } }
注意!點擊後,開始錄製以前先配置一次spa
mBtnStatr.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { configMediaRecorer(); startRecorer(); } });
private void stopRecorer(){ if (mMediaRecorder != null){ mMediaRecorder.stop();//暫停 mMediaRecorder.reset();//重啓到空閒狀態 此方法調用後須要從新配置參數 } }
暫停錄製,注意這裏是pause()方法,不是stop()code
private void pauseRecorder(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { mMediaRecorder.pause();//暫停 } }
恢復錄製orm
private void resumeRecorder(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { mMediaRecorder.resume();//恢復 } }
private void destroy(){ if (mMediaRecorder != null){ mMediaRecorder.stop(); mMediaRecorder.release();//調用這個方法前必需先調用stop()方法 mMediaRecorder = null; } }
關於開始/中止/暫停/恢復/重置/釋放的方法我就不在這裏說明了,上面的流程代碼裏有寫註釋.也說了它們的關鍵點.另外錄製視頻的相關API也不在這裏介紹視頻
配置音頻錄入源,通常只須要選擇MediaRecorder.AudioSource.MIC便可blog
設置錄製音頻的輸出格式,在MediaRecorder.OutputFormat裏有如下這些格式能夠選擇
設置錄製音頻的編碼格式 目前手機設備上可能就MediaRecorder.AudioEncoder.AMR_NB有用,其餘都會報錯
設置輸出音頻文件的路徑加文件名稱,另外有一個setOutputFile(File file)方法,這個方法須要26API
設置音頻的比特率, 比特率是指每秒傳送的比特(bit)數。單位爲 bps(Bit Per Second),比特率越高,每秒傳送數據就越多,音頻也就越清晰
設置錄音文件的最大存儲大小 ,單位是byte
設置錄音文件的最大錄製時間,單位是毫秒
設置監聽異常報錯
設置音頻聲道,官方註解裏也說了這個方法的值通常是1或者2,分別表明單聲道與雙聲道.
設置監聽錄製信息