Android音視訊之AudioRecord

DroidMind發表於2018-11-06
AudioRecord是Android系統提供的用於實現錄音的功能類。

AudioRecord錄製的是PCM格式的音訊檔案,需要用AudioTrack來播放。也可以使用MediaCodec編碼成播放器可以播放的音訊檔案。

AudioRecord錄音的流程為:

(1)構造一個AudioRecord物件,其中需要的最小錄音快取buffer大小可以通過getMinBufferSize方法得到。如果buffer容量過小,將導致物件構造的失敗。

int recordBufSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration, EncodingBitRate);

AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelConfiguration, EncodingBitRate, recordBufSize);複製程式碼

下面說說getMinBufferSize的引數

AudioRecord.getMinBufferSize(
frequency, // 取樣率
channelConfiguration, // 聲道
EncodingBitRate); // 編碼制式複製程式碼

下面對AudioRecord的建構函式進行說明:

public AudioRecord (
int audioSource, // 音訊源
int sampleRateInHz, // 取樣率
int channelConfig,  // 聲道
int audioFormat, // 編碼制式
int bufferSizeInBytes) // 採集資料緩衝區大小複製程式碼

下面對各個引數進行說明:

音訊源:指的是從哪裡採集音訊 下面是Android所支援的音訊源,在MediaRecorder.AudioSource裡面。

/**預設聲音**/

public static final int DEFAULT = 0;

/**麥克風聲音*/

public static final int MIC = 1;

/**通話上行聲音*/

public static final int VOICE_UPLINK = 2;

/**通話下行聲音*/

public static final int VOICE_DOWNLINK = 3;

/**通話上下行聲音*/

public static final int VOICE_CALL = 4;

/**根據攝像頭轉向選擇麥克風*/

public static final int CAMCORDER = 5;

/**對麥克風聲音進行聲音識別,然後進行錄製*/

public static final int VOICE_RECOGNITION = 6;

/**對麥克風中類似ip通話的交流聲音進行識別,預設會開啟回聲消除和自動增益*/

public static final int VOICE_COMMUNICATION = 7;

/**錄製系統內建聲音*/

public static final int REMOTE_SUBMIX = 8;
複製程式碼

取樣率:音訊的取樣頻率,每秒鐘能夠取樣的次數,取樣率越高,音質越高。給出的例項是44100、22050、11025但不限於這幾個引數。例如要採集低質量的音訊就可以使用4000、8000等低取樣率。

聲道設定:android支援雙聲道立體聲和單聲道。MONO單聲道,STEREO立體聲

在AudioFormat裡面

public static final int CHANNEL_IN_MONO = CHANNEL_IN_FRONT;
public static final int CHANNEL_IN_STEREO = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT);
複製程式碼

編碼制式和取樣大小:採集來的資料當然使用PCM編碼 android支援的取樣大小16bit 或者8bit。當然取樣大小越大,那麼資訊量越多,音質也越高,現在主流的取樣大小都是16bit,在低質量的語音傳輸的時候8bit足夠了。

 在AudioFormat裡面

public static final int ENCODING_PCM_16BIT = 2;
public static final int ENCODING_PCM_8BIT = 3;
複製程式碼

(2)開始錄音

audioRecord.startRecording();
複製程式碼

(3)不斷的讀取音訊流,寫入到一個PCM檔案中

byte data[] = new byte[recordBufSize]; 
FileOutputStream os = new FileOutputStream(filename);

while (isRecording) {
    read = audioRecord.read(data, 0, recordBufSize);
    if (AudioRecord.ERROR_INVALID_OPERATION != read) {
         os.write(data);
    }
}
複製程式碼

(4)停止錄音

isRecording = false;
audioRecord.stop();
audioRecord.release();
audioRecord = null;複製程式碼


相關文章