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;複製程式碼