在Android的世界中,一般有两种音频采集的方式,MediaRecorder和AudioRecord,但是MediaRecorder最终还是走到AudioRecord里,让AudioRecord和AudioFlinger进行交互,所以这篇博文就不介绍MediaRecoder了,主要介绍下AudioRecord的录音(音频采集)情况。
基本参数
在AudioRecord源码中我们看到初始化AudioRecord对象时需要传入这几个参数,我们就从这几个参数开始学习如何录音
1.audioSource(音源):
音源,顾名思义就是音频的来源,通过AudioSource文件我们可以看到Android给我们定义了很多不同场景的音频源模式,如MIC,VOICE_CALL,VOICE_RECOGNITION,REMOTE_SUBMIX等。
MediaRecorder.AudioSource.MIC
2.音频采样率(sampleRateInHz)
AudioRecord的第二个参数是采样率,一般设置采样率44100,官方说这个采样率能兼容所有设置,其他常用的还有48000等。
private int sampleRateInHz = 44100;
3.声道设置(AudioFormat):
进入到AudioFormat文件中我们可以看到很多声道配置例如默认声道(CHANNEL_IN_DEFAULT),左声道(CHANNEL_IN_LEFT),右声道(CHANNEL_IN_RIGHT),立体声(CHANNEL_IN_STEREO)等。
public static final int CHANNEL_IN_DEFAULT = 1;
// These directly match native
public static final int CHANNEL_IN_LEFT = 0x4;
public static final int CHANNEL_IN_RIGHT = 0x8;
public static final int CHANNEL_IN_FRONT = 0x10;
public static final int CHANNEL_IN_BACK = 0x20;
public static final int CHANNEL_IN_LEFT_PROCESSED = 0x40;
public static final int CHANNEL_IN_RIGHT_PROCESSED = 0x80;
public static final int CHANNEL_IN_FRONT_PROCESSED = 0x100;
public static final int CHANNEL_IN_BACK_PROCESSED = 0x200;
public static final int CHANNEL_IN_PRESSURE = 0x400;
public static final int CHANNEL_IN_X_AXIS = 0x800;
public static final int CHANNEL_IN_Y_AXIS = 0x1000;
public static final int CHANNEL_IN_Z_AXIS = 0x2000;
public static final int CHANNEL_IN_VOICE_UPLINK = 0x4000;
public static final int CHANNEL_IN_VOICE_DNLINK = 0x8000;
public static final int CHANNEL_IN_MONO = CHANNEL_IN_FRONT;
public static final int CHANNEL_IN_STEREO = (CHANNEL_IN_LEFT | CHANNEL_IN_RIGHT);
private int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
4.采样深度(audioFormat)
采样深度又称为采样精度,是将采样数据以PCM编码保存,每次采集的数据位置宽为16bit。
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
5.缓冲区大小(bufferSizeInBytes)
将采集的音频数据放置在缓存冲内,缓冲区的大小由采样率,声道和采样深度控制。
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
当这几个参数设置完成后,就可以对AudioRecord进行初始化了,如:
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);
开始录音:
mAudioRecord.startRecording();
停止录音:
mAudioRecord.stop();
保存录制文件:
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[bufferSizeInBytes];
while (isRecord) {
int read = mAudioRecord.read(buffer, 0, buffer.length);
if (AudioRecord.ERROR_INVALID_OPERATION != read) {
fileOutputStream.write(buffer);
}
}
最后记得权限需要加上
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
到此录音的全部内容差不多已经没有了,剩下的就需要更多的调试去验证问题。比如录音有噪音,录音不清楚,有回声等,这个还需要进一步学习