使用AudioRecord实现声音采集

      前言:在Android开发中,实现录音的功能一般有三种方式:1.调用系统的录音器  2.使用MediaRecord类实现录音功能  3.使用AudioRecord类。在这里我就不讲前两种方式的实现了,大家可以在网上查找相关的内容。这篇文章主要讲的是使用AudioRecord实现声音采集。

      如果你不需要对采集到的数据进行处理的话,就可以选择使用前面两种方式。但是如果你需要将采集到的数据转化为PCM格式,AAC格式,MP3格式等,就需要使用AudioRecord类进行采集了。

     在使用这个类之前我们先要了解几个概念:

    (1) 采样率

使用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音视频学习)