Android音频录制--AudioRecord
2015-09-10 10:32
531 查看
最近公司有个项目,需要用到音频录制,就研究了一下这部分。
android的音频录制有2种方式,对应的是两个不同的类:AudioRecord和MediaRecord。
MediaRecord的特点是相对来说比较简单,它输出的是一个可播放的音频文件,但是对应的,它缺少对音频的控制(比如要对音频进行改变,变声,混音等)。
AudioRecord的使用相对复杂(其实基本功能的时候还是挺简单的),它输出的是一个音频流,通过这个流文件我们可以做很多事,比如实时的语音聊天,变声(汤姆猫),混音(唱吧)。我们也可以把流写入到文件中,格式一般为raw或者pcm,但是并不能直接播放(因为它是一个裸音频),如果要实现播放,我们还需要给文件加个编码头,这也是汤姆猫变声的原理。
在这篇里,我们主要讲一下AudioRecord的基本使用。
在使用AudioRecord录音之前,需要对它进行初始化,指定一系列的参数:
此外我们还需要定义缓冲区的大小,这个大小不能超过我们获取到的缓冲区大小,然后创建一个AudioRecord的对象
通过
通过
注意结束录音后,释放资源:
开始录音后,我们可以通过read方法来获取音频流:
具体代码如下,我写了一个线程,在UI线程直接录音,会堵塞主线程。
代码地址:AudioRecorder
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
相关文章推荐
- Android中viewSwitcher的使用
- Android TV 鼠标空鼠焦点体验改善
- Android 文件的存储和加载
- android转场动画windowAnimation和ActivityAnimation
- Android客户端与服务端交互之登陆示例
- Android控件之ScrollView用法实例分析
- Android基础——Fragment基础入门(一)
- android activity的变量是什么时候清空的呢?
- Android Studio快捷键
- android-沉浸状态栏以及状态栏背景色如何设置
- Android中内容观察者的使用---- ContentObserver类详解
- Android各类交互良好动画集锦(持续更新)
- Android软键盘回车改为搜索
- android listview嵌套Listview不能显示全部内容
- android开发常用函数集合
- Android APK+Dex文件反编译及回编译工具(APKDB)v.1.9.2 正式版
- 【Android】监测root权限:通过判断su文件确定
- Intent flag参数和Android的四种lauchMode
- 对Android的理解
- Android控件之ListView用法实例详解