Android之音频开发基础入门

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

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

1.采样率

Android之音频开发基础入门_第1张图片

采样是把模拟信号转化为数字信号的过程。图上的纵向直线间隔越密集,表明采样率就越高,采样率越高,音频的音质就越高。

目前Android手机中,44100kHZ可以兼容全部手机的采样率。

2.量化精度(位宽)

上图中,箭头点为采样点。每个采样点都需要用一个数值表示大小,这个数值的类型可以是4bit,8bit,16bit,32bit等。位数越多,表示越精细,声音质量就越好,而数据量也会成倍增大。通常采用的是8bit或16bit。

3.声道数

表示声音录制的音源数或声音播放的扬声器数量。通常有单声道Mono 和双声道Stereo比较常见。

4.音频帧

音频数据是流式的,本身没有帧的概念。不像视频数据是由一张张图像组成的,一帧就是一张图像。

所以约定俗成取2.5ms - 60ms的数据量为一帧音频。

5. PCM

脉冲编码调制(Pulse Code Modulation),它的作用是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程。

从手机采集的数据就是PCM原始数据。

 

代码:

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; //音频缓冲区大小


2、获取缓冲区大小
mMinBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannelCount, mAudioFormat);


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();
  }



4、停止
isRecording =false;
if (mAudioRecord !=null) {
    mAudioRecord.stop();
    mAudioRecord.release();
    mAudioRecord =null;
}



作者:阑珊处等你
链接:https://www.jianshu.com/p/91844b5d5a66
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(音频/视频,Android,Python/人工智能/大数据)