您的位置:首页 > 移动开发 > Android开发

Android音频录制--AudioRecord

2015-09-10 10:32 531 查看
最近公司有个项目,需要用到音频录制,就研究了一下这部分。

android的音频录制有2种方式,对应的是两个不同的类:AudioRecord和MediaRecord。

MediaRecord的特点是相对来说比较简单,它输出的是一个可播放的音频文件,但是对应的,它缺少对音频的控制(比如要对音频进行改变,变声,混音等)。

AudioRecord的使用相对复杂(其实基本功能的时候还是挺简单的),它输出的是一个音频流,通过这个流文件我们可以做很多事,比如实时的语音聊天,变声(汤姆猫),混音(唱吧)。我们也可以把流写入到文件中,格式一般为raw或者pcm,但是并不能直接播放(因为它是一个裸音频),如果要实现播放,我们还需要给文件加个编码头,这也是汤姆猫变声的原理。

在这篇里,我们主要讲一下AudioRecord的基本使用。

在使用AudioRecord录音之前,需要对它进行初始化,指定一系列的参数:

// 音频获取源,通常我们采集的是麦克风的音频,所以使用mic
private int audioSource = MediaRecorder.AudioSource.MIC;

// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
private static int sampleRateInHz = 44100;

// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
private static int channelConfig = AudioFormat.CHANNEL_IN_STEREO;

// 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

// 缓冲区字节大小
private int bufferSizeInBytes = 0;


此外我们还需要定义缓冲区的大小,这个大小不能超过我们获取到的缓冲区大小,然后创建一个AudioRecord的对象

private void prepareAudioRecord() {
// 获得缓冲区字节大小
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig, audioFormat);

// 创建AudioRecord对象
audioRecord = new AudioRecord(audioSource, sampleRateInHz,
channelConfig, audioFormat, bufferSizeInBytes);
}


通过
audioRecord.startRecording();
来开始录音。

通过
audioRecord.stop();
来结束录音。

注意结束录音后,释放资源:

audioRecord.release();//释放资源
audioRecord = null;


开始录音后,我们可以通过read方法来获取音频流:

//对应的三个参数,分别为用来存放音频流的字节数组,偏移量,和缓存大小,每次调用read方法,将bufferSizeInBytes大小的音频字节,放入到audiodata中
audioRecord.read(audiodata, 0, bufferSizeInBytes);


具体代码如下,我写了一个线程,在UI线程直接录音,会堵塞主线程。

代码地址:AudioRecorder
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: