关于使用AudioRecord采集音频PCM数据

采集音频是模拟信号转化为数字信号的过程。

关于Android采集音频的过程,我们需要了解几个概念:

1.采样率

关于使用AudioRecord采集音频PCM数据_第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;

}

你可能感兴趣的:(关于使用AudioRecord采集音频PCM数据)