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

关于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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. android导入外部数据库到项目中的使用方法
  3. android开发实战之做手机号和邮编查询小程序
  4. android保存数据的四种方法
  5. Android(安卓)MediaCodec 音频转码——硬编硬解
  6. android省市二级联动的实现
  7. Android日志:Google官方下拉刷新控件
  8. Android(安卓)AudioManager处理两个播放器同时有声音,停止其中一
  9. Android中 的各种Adapter 整理

随机推荐

  1. 在 Android(安卓)应用中使用数据库
  2. Android(安卓)与 JS 交互数据上限问题【R
  3. 面试例题4:绘制5行文本,每一行的字体大小逐
  4. Android(安卓)2.3 r1 中文API (78)―― Vie
  5. Android(安卓)输入系统
  6. 64位Ubuntu配置android环境报错(...adb":
  7. 活用Android的Message Queue(1/3)
  8. android中菜单以及自定义组件的使用
  9. eclipse中无法新建Android工程 出现问题:P
  10. android 7.1.1 软件升级安装报解析软件包