前言:上文講了 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" />