Android 音频——PCM转WAV

 AudioRecord类管理Java应用程序的音频资源,以录制音频数据。 这一篇文章主要记录下AudioRecord使用方法,通过AudioRecord录制音频数据,并封装成WAV格式数据。

使⽤AudioRecord的录音流程,分为以下⼏步

  1. 获取 创建AudioRecord 所需的buffer size 大小;
  2. 创建AudioRecord
  3. 调⽤AudioRecord.startRecording开始录音。
  4. 读取录制的音频数据AudioRecord.read(data, 0, bufferSize)。
  5. 停止录音,并释放;

1 getMinBufferSize

获取创建AudioRecord对象所需的最小缓冲区大小,以字节为单位。这一步非常重要,必须先获取size,才能之后创建AudioRecord。

this.sampleRate = sampleRate;
this.channelCount = channelCount;
int channelConfig = channelCount == 1 ? AudioFormat.CHANNEL_IN_MONO :AudioFormat.CHANNEL_IN_STEREO;
minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig,AudioFormat.ENCODING_PCM_16BIT);

2 初始化AudioRecord

初始化AudioRecord有以下两种方式。

  • 直接new初始化;
  • 通过Builder模式创建对象。

这两种方式都可以。

// 1
mRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig,AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
// 2
mRecord = new AudioRecord.Builder().setAudioSource(MediaRecorder.AudioSource.MIC).setAudioFormat(new AudioFormat.Builder().setEncoding(AudioFormat.ENCODING_PCM_16BIT).setSampleRate(sampleRate).setChannelMask(channelConfig).build()).setBufferSizeInBytes(minBufferSize).build();

3 开始录音

调用startRecording开始录制音频数据。

if (mRecord != null && mRecord.getState() == AudioRecord.STATE_INITIALIZED) {try {mRecord.startRecording();} catch (IllegalStateException e) {e.printStackTrace();}
}

4 读取音频数据

在新建线程中循环读取数据。read 函数默认情况是阻塞方式读取。

private void writeAudioDataToFile() {FileOutputStream out;try {out = new FileOutputStream(audioFile);} catch (FileNotFoundException e) {e.printStackTrace();out = null;}if (out != null) {try {//先写入wav文件头44字节,最后修改这44字节数据byte[] header = new byte[WAR_HEADER_LENGTH];out.write(header);byte[] data = new byte[minBufferSize];int readSize = 0;while (isRecording) {if (!isPaused) {readSize = mRecord.read(data, 0, minBufferSize);if (readSize != AudioRecord.ERROR_INVALID_OPERATION) {out.write(data, 0, readSize);}}}} catch (IOException e) {e.printStackTrace();}finally {try {out.close();} catch (IOException e) {e.printStackTrace();}}//wav文件修改头部字段。setWaveFileHeader(audioFile, channelCount);}
}

5 暂停

通过stop可以暂停录音,后通过startRecording恢复录音。

public void pauseRecording() {if (mRecord != null && isRecording) {try {pauseRecordingTimer();mRecord.stop();isPaused = true;if (stateListener != null) {stateListener.onPauseRecord();}}catch (IllegalStateException e){e.printStackTrace();}}
}

6 停止录音、释放

stop停止录制音频数据;
release释放相关native内存。

public void stopRecording() {Log.i(TAG, "stopRecording");if (mRecord != null) {try {stopRecordingTimer();isRecording = false;isPaused = false;mRecord.stop();recordingThread = null;} catch (IllegalStateException e) {e.printStackTrace();} finally {mRecord.release();mRecord = null;}if (stateListener != null) {stateListener.onStopRecord(null);}}
}

源代码路径:https://github.com/pyzhangfan/audio-sample-app

欢迎大家关注、评论、点赞、打赏。
你们的支持是我坚持的动力。Thank you!

Android 音频开发——AudioRecord录音相关推荐

  1. Android 音频开发——AudioTrack播放

    Android 音频--PCM转WAV Android 音频开发--AudioRecord录音  AudioTrack类用来管理.播放单个音频资源,它只能播放PCM数据,其他音频格式(aac.amr. ...

  2. Android 音频开发(二) 采集一帧音频数据

    这一节主要介绍如何采集一帧音频数据,如果你对音频的基础概念比较陌生,建议看我的上一篇Android 音频开发(一) 基础入门篇.因为音频开发过程中,经常要涉及到这些基础知识,掌握了这些重要的基础知识后 ...

  3. Android音频开发(2):如何采集一帧音频

    本文重点关注如何在Android平台上采集一帧音频数据.阅读本文之前,建议先读一下我的上一篇文章<Android音频开发(1):基础知识>,因为音频开发过程中,经常要涉及到这些基础知识,掌 ...

  4. 一次搞懂 Android 音频开发

    在接触Android音频开发后,陆陆续续的看了不少的文章,如果说查缺补漏把这些文章梳理清楚,然后逐个整合,那么确实也能完整的推导出音频开发需要掌握的技术.但是对于初学者来说,可能在开发中产生很多障碍以 ...

  5. Android音频开发

    这篇博客 转载自 https://www.jianshu.com/p/c0222de2faed 这里涉及到ndk的一些知识,对于.mk文件不太熟悉的同学要自己去 官网 或者搜索一些博客了解基本知识. ...

  6. Android音频开发(1):音频相关知识

    Android 音频开发 目录 Android音频开发(1):音频相关知识 Android音频开发(2):使用AudioRecord录制pcm格式音频 Android音频开发(3):使用AudioRe ...

  7. Android音频开发(7):音乐可视化-FFT频谱图

    Android 音频开发 目录 Android音频开发(1):音频相关知识 Android音频开发(2):使用AudioRecord录制pcm格式音频 Android音频开发(3):使用AudioRe ...

  8. Android 音频开发(四) 如何播放一帧音频数据下

    再看这一篇文章前,如果你是小白,我建议你先看一下Android 音频开发(一) 基础入门篇这一篇.今天继续讲解如何通过Android SDK自带API实现播放一帧音频数据. 我们都知道,Android ...

  9. Android 音频开发(一) 基础入门篇

    今天主要讲解下Android音频开发的入门知识,希望对想入门却不知如何下手的朋友有所帮助,同时希望能得到高手的指点和帮助. 深入细化基础技能知识点 大致细化如下10个知识点. 音频开发的主要应用有哪些 ...

最新文章

  1. Andriod anim alpha中的属性介绍
  2. Asp.Net站点整合Discuz论坛实现同步注册和单点登录
  3. css3-响应式布局
  4. EL表达式和标准标签库
  5. emqx 使用端口_数据传输、存储、展现,EMQ X + TDengine 搭建 MQTT 物联网数据可视化平台...
  6. pytorch —— nn网络层 - 卷积层
  7. 微型计算机机安装硬盘教程,台式机械硬盘怎么安装?机械硬盘安装图解教程(SATA固态可参考)...
  8. 小米平板2wifi驱动下载_小米平板2 win10驱动
  9. 人工智能语料库技术是什么?来看科普!
  10. 马哥linux视频笔记,马哥linux视频的学习笔记
  11. python 绝对值_Python绝对值– abs()
  12. 打印参数量GFLOPs等的参考链接暂存+pycocotools安装
  13. mysql7.6安装_CentOS7.6离线安装MySql5.7
  14. Codeforces 1010D Mars rover
  15. 快速部署PHP Web环境(docker nginx php mysql redis)
  16. 51实现todos-完整js
  17. 【银河麒麟V10】【服务器】搭建本地镜像源
  18. Object oriented Design
  19. 录取麻省理工计算机博士全奖,录取案例:美国麻省理工学院博士全奖录取
  20. 缓冲区溢出漏洞原理及Linux下利用

热门文章

  1. OpenCV VideoCapture 设置和获取摄像头参数
  2. vue + 微信获取用户信息
  3. 废旧手机安装Syncthing作为文件服务器之2-文件同步
  4. BAT调用服务器的PHP文件时所遇到的问题
  5. 影院售票系统设计与开发 毕业设计毕设参考
  6. Python Flask教程学习03
  7. Redis实战:如何构建类微博的亿级社交平台
  8. 因果信号的傅里叶变换_信号与系统实验报告3实验3 傅里叶变换及其性质
  9. 数商云采购管理系统方案助力采购平台:缩短采购周期、降本增效
  10. java分布式简单实现