Android 使用MediaRecorder實現錄音

Android開發中,實現錄音的方式主要有兩種:MediaRecorderAudioRecord

兩者區別在於MediaRecorder錄製的文件是經過壓縮的,需要設置編碼器,錄製的文件系統可以直接播放。

而AudioRecord錄製的是PCM格式的文件,錄製的文件沒有經過編碼,需要使用AudioTrack播放。

使用步驟

一、添加權限

添加錄音胡權限:

  <uses-permission android:name="android.permission.RECORD_AUDIO" />

RECORD_AUDIO屬於運行時權限,申請權限:

 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);

二、創建 MediaRecorder 對象

2.1、創建MediaRecorder對象
    private MediaRecorder mRecorder;
    
    mRecorder = new MediaRecorder();
2.2、設置音頻源 setAudioSource
//MIC 麥克風音頻源
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

可選的音頻源在 AudioSource 中有:

    public final class AudioSource {

        private AudioSource() {}
        /** @hide */
        public final static int AUDIO_SOURCE_INVALID = -1;
        /** 默認音頻 **/
        public static final int DEFAULT = 0;
        /** 麥克風 */
        public static final int MIC = 1;

        /** Voice call uplink (Tx) audio source.
         * 語音呼叫上行(Tx)音頻源
         */
        public static final int VOICE_UPLINK = 2;

        /** Voice call downlink (Rx) audio source.
         *  語音呼叫下行(Rx)音頻源。
         */
        public static final int VOICE_DOWNLINK = 3;

        /** Voice call uplink + downlink audio source
         *  語音通話上行+下行音頻源
         */
        public static final int VOICE_CALL = 4;

        /** Microphone audio source tuned for video recording, with the same orientation
         *  as the camera if available. */
        public static final int CAMCORDER = 5;

        /** 麥克風音頻源進行了語音識別. */
        public static final int VOICE_RECOGNITION = 6;

        /** Microphone audio source tuned for voice communications such as VoIP. It
         *  will for instance take advantage of echo cancellation or automatic gain control
         *  if available.
         */
        public static final int VOICE_COMMUNICATION = 7;

        /**
         * 用於遠程呈現音頻流子混合的音頻源。
         */
        @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_OUTPUT)
        public static final int REMOTE_SUBMIX = 8;

        /** 麥克風原始音頻
         *  {@link #DEFAULT} otherwise. */
        public static final int UNPROCESSED = 9;

        /**
         * Audio source for capturing broadcast radio tuner output.
         * @hide
         */
        @SystemApi
        public static final int RADIO_TUNER = 1998;

        /**
         * Audio source for preemptible, low-priority software hotword detection
         */
        @SystemApi
        @RequiresPermission(android.Manifest.permission.CAPTURE_AUDIO_HOTWORD)
        public static final int HOTWORD = 1999;
    }
2.3、設置輸出格式: setOutputFormat
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

可選輸出格式有:

    public final class OutputFormat {
        private OutputFormat() {}
        public static final int DEFAULT = 0;
        /** 3GPP media file format*/
        public static final int THREE_GPP = 1;
        /** MPEG4 media file format*/
        public static final int MPEG_4 = 2;
        /** The following formats are audio only .aac or .amr formats */
        /**
         * AMR NB file format
         * @deprecated  Deprecated in favor of MediaRecorder.OutputFormat.AMR_NB
         */
        public static final int RAW_AMR = 3;
        /** AMR NB file format */
        public static final int AMR_NB = 3;
        /** AMR WB file format */
        public static final int AMR_WB = 4;
        /** @hide AAC ADIF file format */
        public static final int AAC_ADIF = 5;
        /** AAC ADTS file format */
        public static final int AAC_ADTS = 6;
        /** @hide Stream over a socket, limited to a single stream */
        public static final int OUTPUT_FORMAT_RTP_AVP = 7;
        /** H.264/AAC data encapsulated in MPEG2/TS */
        public static final int MPEG_2_TS = 8;
        /** VP8/VORBIS data in a WEBM container */
        public static final int WEBM = 9;
    };
2.4、設置輸出文件名 setOutputFile
		String mFileName = getExternalCacheDir().getAbsolutePath() + "/audio_test.3gp";
        mRecorder.setOutputFile(mFileName);
2.5、設置音頻編碼 setAudioEncoder
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

可選編碼有:

    public final class AudioEncoder {
        private AudioEncoder() {}
        public static final int DEFAULT = 0;
        /** AMR (Narrowband) audio codec */
        public static final int AMR_NB = 1;
        /** AMR (Wideband) audio codec */
        public static final int AMR_WB = 2;
        /** AAC Low Complexity (AAC-LC) audio codec */
        public static final int AAC = 3;
        /** High Efficiency AAC (HE-AAC) audio codec */
        public static final int HE_AAC = 4;
        /** Enhanced Low Delay AAC (AAC-ELD) audio codec */
        public static final int AAC_ELD = 5;
        /** Ogg Vorbis audio codec */
        public static final int VORBIS = 6;
    }

三、準備錄製(prepare()、start())

錄製前需要調用prepare()方法

    private void startRecord() {
        mRecorder = new MediaRecorder();
        //設置錄入音頻源
        //MIC 麥克風音頻源
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //設置輸出格式
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        //設置輸出文件
        mRecorder.setOutputFile(mFileName);
        //設置音頻編碼
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        //準備編碼
        try {
            mRecorder.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //開始錄製
        mRecorder.start();
        mRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
            @Override
            public void onError(MediaRecorder mr, int what, int extra) {
                //mRecorder.reset();
                Log.e("tag", "zzy:  錄製出錯");
            }
        });
    }

四、停止錄製 stop()

     mRecorder.stop();

五、播放音頻

播放的話可以找到錄製的文件進行播放,也可以使用MediaPlayer進行播放

	//初始化
	MediaPlayer mPlayer;
	mPlayer = new MediaPlayer();
	mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mPlayer.start();
        }
    });
	//點擊播放
    mPlayer.setDataSource(mFileName);
    mPlayer.prepareAsync();

MediaRecorder 用法還是很簡單的,更多的用例可以到官網上查看

參考: https://developer.android.google.cn/guide/topics/media/mediarecorder?hl=zh_cn

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章