Android音频录制--AudioRecord

来源:互联网 发布:老年保健数据 编辑:程序博客网 时间:2024/06/04 22:32

最近公司有个项目,需要用到音频录制,就研究了一下这部分。
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

0 0