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;复制代码