音頻筆記-AudioRecord

前言:上文講了 AudioTrack 今天講一講AudioRecord如何錄製PCM音頻。

基本構造

先說一下基本構造

audioRecord = new AudioRecord.Builder()
        .setAudioSource(MediaRecorder.AudioSource.MIC)
        .setBufferSizeInBytes(mBufferSize)
        .setAudioFormat(new AudioFormat.Builder()
                .setSampleRate(44100)
                .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
                .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                .build())
        .build();

另一種構造

audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, mBufferSize);

參數

其他參數和AudioTrack的參數差不多
這裏只講一個

setAudioSource

例如
setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION)

講幾個可用的值,其他值都是系統預留的,第三方軟件無法使用。

屬性 釋義(翻譯來自官方)
MIC 普通麥克風
VOICE_COMMUNICATION 克風音頻源已針對VoIP等語音通信進行了調整。例如,它將利用回聲消除或自動增益控制(如果可用)的優勢。(我項目裏是這個,自動除雜的MIC,聲音效果能好點)
VOICE_RECOGNITION 用於捕獲要實時處理並回放以進行現場表演(例如卡拉OK)的音頻的來源。捕獲路徑將最大程度地減少延遲,並與播放路徑耦合。
VOICE_PERFORMANCE 麥克風音頻源經過了語音識別。

getMinBufferSize

和AudioTrack的差不多

mBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);

錄製pcm並保存爲文件:

開始錄製

public void record() {
        if (audioRecord == null) {
            //爲空
            return;
        }
        if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
            //尚未初始化
            return;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //文件名
                    String filePath;//要保存的文件路徑
                    //初始化outPutStream
                    fileOutputStream = new FileOutputStream(filePath);
                    byte[] audioDataArray = new byte[mBufferSize];//一次寫入的最小單位數
                    //開啓
                    audioRecord.startRecording();
                    while ((audioRecord.read(audioDataArray, 0, mBufferSize)) > 0) {
                    	//不停的寫入
                        fileOutputStream.write(audioDataArray);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (null != fileOutputStream) {
                            fileOutputStream.close();
                            fileOutputStream = null;
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }

停止

public void stop() {
        if (audioRecord.getState() == AudioRecord.STATE_INITIALIZED) {
            audioRecord.stop();
        }
    }

權限

因爲是錄製並且有寫入文件的操作所以權限有:

  • 文件操作
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  • 音頻相關
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章