前言:上文讲了 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() {
@Overridepublic void run() {
try {
//文件名String filePath;//要保存的文件路径//初始化outPutStreamfileOutputStream = 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" />
Demo地址
https://github.com/tc7326/audio.video.demo