使用AudioRecord实现声音采集
2017-12-18 08:15
218 查看
前言:在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.创建需要的参数。 如采样率,声道数等
2.获取缓冲区大小
//获取缓冲区的大小
mMinBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannelCount, audioFormat);
//AudioRecord对象实例化
mAudioRecord = new AudioRecord(mAudioSource, mSampleRate, mChannelCount, audioFormat, mMinBufferSize);
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实现音频播放
如果你不需要对采集到的数据进行处理的话,就可以选择使用前面两种方式。但是如果你需要将采集到的数据转化为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对象实例化
mAudioRecord = new AudioRecord(mAudioSource, mSampleRate, mChannelCount, audioFormat, mMinBufferSize);
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实现音频播放
相关文章推荐
- Android使用AudioRecord采集声音时声音播放很快解决方案
- iOS中声音采集与播放的实现(使用AudioQueue)
- 使用AudioRecord和 AudioTrack实现录音并播放
- 使用DirectSound进行PCM声音采集
- 使用PHP实现采集远程图片功能
- 【转载】VC中实现语音(声音)数据的采集(附源代码)
- 示例 - 25行代码等价实现 - 借助Nodejs在服务端使用jQuery采集17173游戏排行信息
- .Net Windows 程序中 使用WebBrowser实现需要登陆的页面截取(采集)
- 使用 audio 和 embed 实现浏览器兼容的网页声音播放
- 使用3.0实现微信打飞机——13.添加声音
- VC中实现语音(声音)数据的采集(附源代码)
- 【iOS录音与播放】实现利用音频队列,通过缓存进行对声音的采集与播放
- 使用QSnipps和360云盘实现多机代码片段采集
- 25行代码等价实现-借助Nodejs在服务端使用jQuery采集17173游戏排行信息
- 使用JS播放声音/音乐的实现方法
- 使用PHP实现采集远程图片功能
- 采集baidu搜索信息的java源代码实现(使用了htmlunit和Jsoup)
- 在FMOD中使用customRollOff实现更自然的声音衰减
- 如何使用C#实现网易博客中圈子用户数据的采集