Android 開發 MediaRecorder音頻錄製

前言

  MediaRecorder類是Android sdk提供的一個專門用於音視頻錄製,通常利用手機麥克風採集音頻和攝像頭採集圖像.這個類是屬於簡單的音頻錄製類,錄製音頻簡單容易可是對音頻流的控制也比較弱,這篇博客將只介紹音頻的錄製android

實現流程

  1. 獲取權限
  2. 實例化MediaRecorder
  3. 配置MediaRecorder
  4. 開啓錄音
  5. 中止錄音
  6. 暫停錄音與恢復錄音
  7. 銷燬釋放

獲取權限

    <!--音頻錄製權限 -->
    <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後須要動態受權網絡

實例化MediaRecorder

  private MediaRecorder mMediaRecorder;
    private void initMediaRecorer(){
        mMediaRecorder = new MediaRecorder();
    }

沒啥好說的,就是new一個MediaRecorderide

配置MediaRecorder

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

關於開始/中止/暫停/恢復/重置/釋放的方法我就不在這裏說明了,上面的流程代碼裏有寫註釋.也說了它們的關鍵點.另外錄製視頻的相關API也不在這裏介紹視頻

setAudioSource(int audio_source)

配置音頻錄入源,通常只須要選擇MediaRecorder.AudioSource.MIC便可blog

setOutputFormat(int output_format)

設置錄製音頻的輸出格式,在MediaRecorder.OutputFormat裏有如下這些格式能夠選擇

  • DEFAULT:默認  在不更新對應值的狀況下,不要更改這些值
  • THREE_GPP:3GP格式
  • MPEG_4:MP4格式
  • RAW_AMR:錄製原始文件,這隻支持音頻錄製,同時要求音頻編碼爲AMR_NB
  • AMR_NB:   經常使用與通話文件語音格式 語音帶寬範圍:300-3400Hz,8KHz採樣 
  • AMR_WB:   經常使用與通話文件語音格式  語音帶寬範圍: 50-7000Hz,16KHz採樣 
  • AAC_ADIF:  Audio Data Interchange Format音頻數據交換格式。這種格式的特徵是能夠肯定的找到這個音頻數據的開始,不需進行在音頻數據流中間開始的解碼,即它的解碼必須在明肯定義的開始處進行。故這種格式經常使用在磁盤文件中。
  • AAC_ADTS:  Audio Data Transport Stream 音頻數據傳輸流。這種格式的特徵是它是一個有同步字的比特流,解碼能夠在這個流中任何位置開始。它的特徵相似於mp3數據流格式。這種格式能夠用於廣播電視。
  • OUTPUT_FORMAT_RTP_AVP: 未知
  • MPEG_2_TS:MPEG2-TS(Transport Stream「傳輸流」;又稱TS、TP、MPEG-TS 或 M2T)是用於音效、圖像與數據的通訊協定,最先應用於DVD的實時傳送節目。
  • WEBM:  WebM由Google提出,是一個開放、免費的媒體文件格式。WebM 影片格式實際上是以 Matroska(即 MKV)容器格式爲基礎開發的新容器格式,裏面包括了VP8影片軌和 Ogg Vorbis 音軌,其中Google將其擁有的VP8視頻編碼技術以相似BSD受權開源,Ogg Vorbis 原本就是開放格式。 WebM標準的網絡視頻更加偏向於開源而且是基於HTML5標準的,WebM 項目旨在爲對每一個人都開放的網絡開發高質量、開放的視頻格式,其重點是解決視頻服務這一核心的網絡用戶體驗。Google 說 WebM 的格式至關有效率,應該能夠在 netbook、tablet、手持式裝置等上面順暢地使用

 setAudioEncoder(int audio_encoder)

 設置錄製音頻的編碼格式  目前手機設備上可能就MediaRecorder.AudioEncoder.AMR_NB有用,其餘都會報錯

setOutputFile(String path)

設置輸出音頻文件的路徑加文件名稱,另外有一個setOutputFile(File file)方法,這個方法須要26API

setAudioEncodingBitRate(int bitRate)

設置音頻的比特率, 比特率是指每秒傳送的比特(bit)數。單位爲 bps(Bit Per Second),比特率越高,每秒傳送數據就越多,音頻也就越清晰

setMaxFileSize(long max_filesize_bytes)

設置錄音文件的最大存儲大小 ,單位是byte

setMaxDuration(int max_duration_ms)

設置錄音文件的最大錄製時間,單位是毫秒

setOnErrorListener(OnErrorListener l)

設置監聽異常報錯

setAudioChannels(int numChannels) 

設置音頻聲道,官方註解裏也說了這個方法的值通常是1或者2,分別表明單聲道與雙聲道.

setOnInfoListener(OnInfoListener listener)

設置監聽錄製信息

相關文章
相關標籤/搜索