Android 音频开发——AudioRecord录音
Android 音频——PCM转WAV
AudioRecord类管理Java应用程序的音频资源,以录制音频数据。 这一篇文章主要记录下AudioRecord使用方法,通过AudioRecord录制音频数据,并封装成WAV格式数据。
使⽤AudioRecord的录音流程,分为以下⼏步
- 获取 创建AudioRecord 所需的buffer size 大小;
- 创建AudioRecord
- 调⽤AudioRecord.startRecording开始录音。
- 读取录制的音频数据AudioRecord.read(data, 0, bufferSize)。
- 停止录音,并释放;
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录音相关推荐
- Android 音频开发——AudioTrack播放
Android 音频--PCM转WAV Android 音频开发--AudioRecord录音 AudioTrack类用来管理.播放单个音频资源,它只能播放PCM数据,其他音频格式(aac.amr. ...
- Android 音频开发(二) 采集一帧音频数据
这一节主要介绍如何采集一帧音频数据,如果你对音频的基础概念比较陌生,建议看我的上一篇Android 音频开发(一) 基础入门篇.因为音频开发过程中,经常要涉及到这些基础知识,掌握了这些重要的基础知识后 ...
- Android音频开发(2):如何采集一帧音频
本文重点关注如何在Android平台上采集一帧音频数据.阅读本文之前,建议先读一下我的上一篇文章<Android音频开发(1):基础知识>,因为音频开发过程中,经常要涉及到这些基础知识,掌 ...
- 一次搞懂 Android 音频开发
在接触Android音频开发后,陆陆续续的看了不少的文章,如果说查缺补漏把这些文章梳理清楚,然后逐个整合,那么确实也能完整的推导出音频开发需要掌握的技术.但是对于初学者来说,可能在开发中产生很多障碍以 ...
- Android音频开发
这篇博客 转载自 https://www.jianshu.com/p/c0222de2faed 这里涉及到ndk的一些知识,对于.mk文件不太熟悉的同学要自己去 官网 或者搜索一些博客了解基本知识. ...
- Android音频开发(1):音频相关知识
Android 音频开发 目录 Android音频开发(1):音频相关知识 Android音频开发(2):使用AudioRecord录制pcm格式音频 Android音频开发(3):使用AudioRe ...
- Android音频开发(7):音乐可视化-FFT频谱图
Android 音频开发 目录 Android音频开发(1):音频相关知识 Android音频开发(2):使用AudioRecord录制pcm格式音频 Android音频开发(3):使用AudioRe ...
- Android 音频开发(四) 如何播放一帧音频数据下
再看这一篇文章前,如果你是小白,我建议你先看一下Android 音频开发(一) 基础入门篇这一篇.今天继续讲解如何通过Android SDK自带API实现播放一帧音频数据. 我们都知道,Android ...
- Android 音频开发(一) 基础入门篇
今天主要讲解下Android音频开发的入门知识,希望对想入门却不知如何下手的朋友有所帮助,同时希望能得到高手的指点和帮助. 深入细化基础技能知识点 大致细化如下10个知识点. 音频开发的主要应用有哪些 ...
最新文章
- Andriod anim alpha中的属性介绍
- Asp.Net站点整合Discuz论坛实现同步注册和单点登录
- css3-响应式布局
- EL表达式和标准标签库
- emqx 使用端口_数据传输、存储、展现,EMQ X + TDengine 搭建 MQTT 物联网数据可视化平台...
- pytorch —— nn网络层 - 卷积层
- 微型计算机机安装硬盘教程,台式机械硬盘怎么安装?机械硬盘安装图解教程(SATA固态可参考)...
- 小米平板2wifi驱动下载_小米平板2 win10驱动
- 人工智能语料库技术是什么?来看科普!
- 马哥linux视频笔记,马哥linux视频的学习笔记
- python 绝对值_Python绝对值– abs()
- 打印参数量GFLOPs等的参考链接暂存+pycocotools安装
- mysql7.6安装_CentOS7.6离线安装MySql5.7
- Codeforces 1010D	Mars rover
- 快速部署PHP Web环境(docker nginx php mysql redis)
- 51实现todos-完整js
- 【银河麒麟V10】【服务器】搭建本地镜像源
- Object oriented Design
- 录取麻省理工计算机博士全奖,录取案例:美国麻省理工学院博士全奖录取
- 缓冲区溢出漏洞原理及Linux下利用