您的位置:首页 > 其它

使用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.创建需要的参数。 如采样率,声道数等

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实现音频播放  

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息