Android 音视频深入 一 AudioRecord录音生成pcm转换为wav(附源码下载)
本篇项目地址,求star
https://github.com/979451341/Audio-and-video-learning-materials/tree/master/AudioRecord%E5%BD%95%E9%9F%B3%EF%BC%88%E8%83%BD%E6%9A%82%E5%81%9C%EF%BC%8C%E5%B0%86pch%E8%BD%AC%E6%8D%A2%E4%B8%BAwav%EF%BC%89
先来段官方说明
1.AndioRecord大概说明
AndioRecord类的主要功能是让各种JAVA应用能够管理音频资源,以便它们通过此类能够录制声音相关的硬件所收集的声音。此功能的实现就是通过”pulling”(读取)AudioRecord对象的声音数据来完成的。在录音过程中,应用所需要做的就是通过后面三个类方法中的一个去及时地获取AudioRecord对象的录音数据. AudioRecord类提供的三个获取声音数据的方法分别是read(byte[], int, int), read(short[], int, int), read(ByteBuffer, int). 无论选择使用那一个方法都必须事先设定方便用户的声音数据的存储格式。
开始录音的时候,AudioRecord需要初始化一个相关联的声音buffer, 这个buffer主要是用来保存新的声音数据。这个buffer的大小,我们可以在对象构造期间去指定。它表明一个AudioRecord对象还没有被读取(同步)声音数据前能录多长的音(即一次可以录制的声音容量)。声音数据从音频硬件中被读出,数据大小不超过整个录音数据的大小(可以分多次读出),即每次读取初始化buffer容量的数据。
2.AudioRecord对象创建
AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)
audioSource
音频源:指的是从哪里采集音频。这里我们当然是从麦克风采集音频,所以此参数的值为MIC
sampleRateInHz
采样率:音频的采样频率,每秒钟能够采样的次数,采样率越高,音质越高。给出的实例是44100、22050、11025但不限于这几个参数。例如要采集低质量的音频就可以使用4000、8000等低采样率。
channelConfig
声道设置:android支持双声道立体声和单声道。MONO单声道,STEREO立体声
audioFormat
编码制式和采样大小:采集来的数据当然使用PCM编码(脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。) android支持的采样大小16bit 或者8bit。当然采样大小越大,那么信息量越多,音质也越高,现在主流的采样大小都是16bit,在低质量的语音传输的时候8bit足够了。
bufferSizeInBytes
采集数据需要的缓冲区的大小,如果不知道最小需要的大小可以在getMinBufferSize()查看。
AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig, channelConfig);
3.PCM和WAV文件
PCM
PCM是在由模拟信号向数字信号转化的一种常用的编码格式,称为脉冲编码调制,PCM将模拟信号按照一定的间距划分为多段,然后通过二进制去量化每一个间距的强度。PCM表示的是音频文件中随着时间的流逝的一段音频的振幅。Android在WAV文件中支持PCM的音频数据。
WAV文件
WAV,MP3等是我们比较常见的音频格式,不同的编码格式对原始音频采用的编码方式也是不同的,通常为了方便传输等问题,会对原始音频进行压缩,同时为了能够使得播放器能够识别该种格式,所以在每种格式的头文件都是特定的,有一定的规则,来让播放器识别出是该种格式,然后按着相应的解码算法去播放后面的音频文件。
4.代码运行过程
首先是创建和配置AudioRecord
//音频输入-麦克风private final static int AUDIO_INPUT = MediaRecorder.AudioSource.MIC;//采用频率//44100是目前的标准,但是某些设备仍然支持22050,16000,11025//采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级private final static int AUDIO_SAMPLE_RATE = 16000;//声道 单声道private final static int AUDIO_CHANNEL = AudioFormat.CHANNEL_IN_MONO;//编码private final static int AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;// 缓冲区字节大小private int bufferSizeInBytes = 0;//录音对象private AudioRecord audioRecord;/*** 创建默认的录音对象** @param fileName 文件名*/public void createDefaultAudio(String fileName) {// 获得缓冲区字节大小bufferSizeInBytes = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_RATE,AUDIO_CHANNEL, AUDIO_ENCODING);audioRecord = new AudioRecord(AUDIO_INPUT, AUDIO_SAMPLE_RATE, AUDIO_CHANNEL, AUDIO_ENCODING, bufferSizeInBytes);this.fileName = fileName;status = Status.STATUS_READY;}
开始录音,同时开个子线程将录音的数据放入pcm文件
audioRecord.startRecording();new Thread(new Runnable() {@Overridepublic void run() {writeDataTOFile(listener);}}).start();
如何将音频写入文件是重点,我写个伪代码,说明这个代码运行顺序
首先创建pcm文件,得到他的FileOutputStream,然后不断循环AudioRecord通过read将录音的数据放入字节数组里,当录音结束的时候要记得停止这个循环
// new一个byte数组用来存一些字节数据,大小为缓冲区大小byte[] audiodata = new byte[bufferSizeInBytes];FileOutputStream fos = null;int readsize = 0;try {File file = new File(currentFileName);if (file.exists()) {file.delete();}fos = new FileOutputStream(file);// 建立一个可存取字节的文件} catch (IllegalStateException e) {Log.e("AudioRecorder", e.getMessage());throw new IllegalStateException(e.getMessage());} catch (FileNotFoundException e) {Log.e("AudioRecorder", e.getMessage());}while (true) {readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes);if (AudioRecord.ERROR_INVALID_OPERATION != readsize && fos != null) {try {fos.write(audiodata);} catch (IOException e) {Log.e("AudioRecorder", e.getMessage());}}}
如何我们要实现能够暂停录音,只要AudioRecord.stop就行,然后当继续录音时在AudioRecord.start就好了,但是要另创建一个pcm记录,当录音结束时我们要将这些pcm一起转换为一个wav,
至于pcm转换为wav的代码是固定的,我就不贴出,大家在文章首部代码地址自取吧
参考文章
http://blog.csdn.net/hellofeiya/article/details/8968534
http://blog.csdn.net/JenseaChen/article/details/46883319
Android 音视频深入 一 AudioRecord录音生成pcm转换为wav(附源码下载)相关推荐
- Android 音视频深入 十五 FFmpeg 推流mp4文件(附源码下载)
源码地址 https://github.com/979451341/Rtmp 1.配置RTMP服务器 这个我不多说贴两个博客分别是在mac和windows环境上的,大家跟着弄 MAC搭建RTMP服务器 ...
- Java可以hook微信吗,Hook实现Android 微信、陌陌 、探探位置模拟(附源码下载)
Hook实现Android 微信.陌陌 .探探位置模拟 最近需要对微信,陌陌等程序进行位置模拟 实现世界各地发朋友圈,搜索附近人的功能,本着站在巨人肩膀上的原则 爱网上搜索一番. 也找到一些 代码和文 ...
- android flv 编码器,Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)...
Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载) 项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码 ...
- 二维码生成工具微信小程序源码下载
二维码生成工具 支持上传二维码logo和调整尺寸背景颜色等等 无需域名与服务器 使用教程,用HBuilder X软件打卡项目然后运行到微信小程序即可 下方是演示图: 小程序源码下载地址: (已更新)二 ...
- python绘制球体_OpenGL三维球体数据生成与绘制【附源码】
OpenGL三维球体数据生成与绘制源码: #include #include #include #include #include #include #include #include #includ ...
- 万圣节头像框生成工具微信小程序源码下载支持流量主收益模式
大家好万圣节马上就要来了 那么临近了万圣节那么也给大家带来了一款与万圣节相关的程序 那么这款程序呢就是可以制作生成与万圣节相关的头像框 内含多种模板风格可供选择 支持用户上传模式和自动获取微信头像模式 ...
- Android项目小结---闹铃备忘录小开发知识点(附有:源码下载)
一.闹铃功能介绍: 1.为每条备忘添加闹铃 2.备忘内容和闹铃信息存在SQL中 3.可删除每天记录和闹铃或者删除所有 4.到点闹铃启动,包括锁屏时和重开机 5.在桌面的创建一个widget类似便签那样 ...
- Android 音视频开发(一):PCM 格式音频的播放与采集
什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...
- Android 统一打包框架(附源码下载)
唠叨: 把手给我,我带你去吃云浮吃石磨肠粉.云吞面,木瓜渣. 那里的肠粉和广州的不一样,皮很薄很滑,肉馅没广州的那么花里胡哨,只有肉碎和香葱.但吃起来就很香滑,再配上它的甜辣酱.那味道好极了. 云吞面 ...
最新文章
- LINUX服务器出网带宽 一直被占用原因查找
- Qt工作笔记-使用qrand与QTime产生随机数
- jQuery 之 [ DOM操作 ]
- Python+OpenCV:图像金字塔
- ATA/SATA/SCSI/SAS/FC总线简介
- karto探秘之open_karto 第五章 --- 栅格地图的生成
- stata 自相关专题【计量经济系列(五)】
- matlab计算天线方向性系数,天线方向图(Antenna Pattern)的设计解析思路
- 【软件相关】win10自带软件“画图”的妙用
- 【数据库设计及SQL代码实现】英皇电影院电影管理系统
- aircrack-ng/airdrop-ng
- 【100%通过率】华为OD机试真题 Python 实现【预订酒店】【2022.11 Q4 新题】
- 断点回归matlab,【独家发布】使用地理边界进行断点回归设计
- 在腾讯这一年,坚守初心持续单纯 | 2021年终总结
- Java技术Jsoup爬取数据手动登录
- 推理机Jess,Racer,Jena
- 国内外学者联合撰写,ChatGPT技术路线图
- 让应用程序禁止Windows屏幕保护
- oracle 层级 汇总,oracle 部门层级查询
- 五五规划首年“开门红”,特步离跻身第一梯队还差几个五年?
热门文章
- r语言aggredate_R语言 aggregate函数
- Android Framework- Zygote进程以及其初始化
- python编写游戏怎么打包——详解python+pygame游戏开发之使用Py2exe打包游戏为exe文件
- matlab 滤波窗函数,Matlab窗函数设计FIR滤波器
- 【DTCC2016】付铨:用技术打消用户上国产系统疑虑
- 高通机器学习与多媒体工程师面试
- 计算机设备和打印机打不开,教你win7电脑中的设备和打印机无法打开怎么办
- 酸性食物为什么伤牙+早期牙周炎
- 智能翻译机python实现详细解释
- 关于Thread.IsBackground属性的理解(转载)