前言:在Android开发中,实现录音的功能一般有三种方式:1.调用系统的录音器 2.使用MediaRecord类实现录音功能 3.使用AudioRecord类。在这里我就不讲前两种方式的实现了,大家可以在网上查找相关的内容。这篇文章主要讲的是使用AudioRecord实现声音采集。
如果你不需要对采集到的数据进行处理的话,就可以选择使用前面两种方式。但是如果你需要将采集到的数据转化为PCM格式,AAC格式,MP3格式等,就需要使用AudioRecord类进行采集了。
在使用这个类之前我们先要了解几个概念:
(1) 采样率
采样就是把模拟信号转化为数字信号的过程。
我们可以把采样率看作是上图中,每条红线的间隔,间隔越密集的时候,采样率就越高,音频的音质就越高。
在Android手机设备中,44100kHZ是可以兼容全部手机的采样率。
(2)量化精度(位宽)
在上图中,每个红点表示为量化精度,常见的数据类型大小是,4bit,8bit,16bit,32bit等。
(3)声道数
表示声音录制时音源数量或播放时相应的扬声器数量。单声道(Mono)和双声道(Stereo)比较常见
(4)bufferSizeInBytes
它表示AudioRecord内部的音频缓冲区的大小。该缓冲区的值不能低于一帧的“音频帧”的大小。
一帧音频帧的大小计算公式是: int size = 采样率 * 位宽 * 采样时间 * 通道数
Android系统提供了一个方法获取bufferSizeInBytes的值。即Audio.getMinBufferSize()。
简单使用:
1. 创建需要的参数。 如采样率,声道数等
2. 获取缓冲区大小
3. 实例化AudioRecord
4. 开始录制startRecording(),并开启一个线程用于不断写入文件
5.停止,并释放资源
接下来咱们上代码:
1.创建需要的参数。 如采样率,声道数等
private AudioRecord mAudioRecord; private int mSampleRate = 44100;//采样率 private int mChannelCount = AudioFormat.CHANNEL_IN_MONO;//双声道 private int mAudioSource = MediaRecorder.AudioSource.MIC;//麦克风 private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;//量化精度 private int mMinBufferSize;2.获取缓冲区大小
//获取缓冲区的大小
mMinBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannelCount, audioFormat);
3.实例化AudioRecord//AudioRecord对象实例化
4.开始录制startRecording(),并开启一个线程用于不断写入文件
private void recording() {
//开始录制
mAudioRecord.startRecording();
new Thread(new Runnable() {
@Override
public void run() {
byte[] bytes = new byte[mMinBufferSize];
while (isRecording) {
//将数据加入数组中
int len = mAudioRecord.read(bytes, 0, bytes.length);
try {
//接入文件
dataOutPutStream.write(bytes, 0, len);
} catch (IOException e) {
e.printStackTrace();
}
}
try {
if(dataOutPutStream != null){
dataOutPutStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
5.停止,并释放资源
isRecording = false;
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord = null;
最后:需要申请权限,申请权限,申请权限。重要的事情说三遍。
站在巨人的肩膀上
参考:http://blog.51cto.com/ticktick/1748506
后语:这是我第一次写博客,用词和文章整体结构不是很好。欢迎大家指点。。。
音视频开发一直是我很向往的一块圣地,刚刚学习,多多指教。
下一篇我将带来 使用AudioTrack实现音频播放