关于使用AudioRecord采集音频PCM数据
采集音频是模拟信号转化为数字信号的过程。
关于Android采集音频的过程,我们需要了解几个概念:
1.采样率

采样是把模拟信号转化为数字信号的过程。图上的纵向直线间隔越密集,表明采样率就越高,采样率越高,音频的音质就越高。
目前Android手机中,44100kHZ可以兼容全部手机的采样率。
2.量化精度(位宽)
上图中,箭头点为采样点。每个采样点都需要用一个数值表示大小,这个数值的类型可以是4bit,8bit,16bit,32bit等。位数越多,表示越精细,声音质量就越好,而数据量也会成倍增大。通常采用的是8bit或16bit。
3.声道数
表示声音录制的音源数或声音播放的扬声器数量。通常有单声道Mono 和双声道Stereo比较常见。
4.音频帧
音频数据是流式的,本身没有帧的概念。不像视频数据是由一张张图像组成的,一帧就是一张图像。
所以约定俗成取2.5ms - 60ms的数据量为一帧音频。
5. PCM
脉冲编码调制(Pulse Code Modulation),它的作用是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程。
从手机采集的数据就是PCM原始数据。
代码:
6.1 声明需要的数据
private AudioRecordmAudioRecord;
private int mSampleRate =44100;//采样率
private int mChannelCount = AudioFormat.CHANNEL_IN_MONO;//单声道
private int mAudioSourse = MediaRecorder.AudioSource.MIC;//声音来源
private int mAudioFormat = AudioFormat.ENCODING_PCM_16BIT;//位宽
private int mMinBufferSize; //音频缓冲区大小
6.2 获取缓冲区大小
mMinBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannelCount, mAudioFormat);
6.3 开启一个子线程做采集工作
int len =0;
private void record()throws IOException {
mAudioRecord.startRecording(); //开始采集
isRecording =true;
file =new File(rootFile, "test.pcm"); //创建一个文件
if (!file.exists()) {
file.createNewFile();
}
new Thread(new Runnable() {
@Override
public void run() {
byte[] bys =new byte[mMinBufferSize]; //根据缓冲区大小,设置字节数组的大小
FileOutputStream outputStream =null;
try {
outputStream =new FileOutputStream(file);
}catch (FileNotFoundException e) {
e.printStackTrace();
}
while (isRecording) { //循环采集
len =mAudioRecord.read(bys, 0, bys.length); //采集到的数据存入数组中
try {
outputStream.write(bys, 0, len); //将数据写入文件中
}catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream !=null) {
try {
outputStream.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
6.4 停止
isRecording =false;
if (mAudioRecord !=null) {
mAudioRecord.stop();
mAudioRecord.release();
mAudioRecord =null;
}