Android提供了两个API用于实现录音功能:
android.media.AudioRecord和android.media.MediaRecorder,对比如下:
API | 应用场景 | 优点 | 缺点 |
---|---|---|---|
AudioRecord | 边录边播实时处理 | 可以用代码实现各种音频的封装 | 输出PCM语音数据,若保存成音频文件,不能被播放器识别的,必须开发者编写代码实现数据编码以及压缩。 |
MediaRecorder | 普通录音 | 使用简单,已经集成了录音、编码、压缩等,支持少量音频格式 | 无法实时处理音频 |
会说话的汤姆猫,以及其他语音识别与处理的软件(如百度翻译、科大讯飞翻译),获取音源数据肯定是使用了AudioRecord。用AudioRecord录音,并实现WAV格式封装,未经过任何压缩,输出的音频文件很大。MediaRecorder由于已经实现了音频数据的压缩和编码,支持.aac(API = 16) .amr .3gp等,因此,输出的音频文件较小。
当然,这里说的文件大小跟采样率以及采集通道的选择还有直接关系。比如AudioRecord,16000的采用率,单声道,那么录制1秒获取的原始数据量为16000个short,也就是32000个字节;双通道就再乘以2,即64000个字节。
使用MediaRecorder比较简单:
public void startAudioRecord(String saveFilePath){
mediaRecorder = new MediaRecorder();
recordFile = new File(saveFilePath);
// 判断,若当前文件已存在,则删除
if (recordFile.exists()) {
recordFile.delete();
}
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioChannels(2);
mediaRecorder.setAudioSamplingRate(16000);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile(recordFile.getAbsolutePath())