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