Android AudioRecord录制PCM以及转换为wav和mp3
Android AudioRecord录制PCM以及转换为wav和mp3
1.录制pcm
pcm介绍
pcm是指音频裸数据是脉冲编码调制数据。描述一段PCM数据通常以下几个概念:
- 量化格式(SampleFormat)又叫位深度:表示可以记录声音的动态范围,代表分贝
- 采样率(SampleRate):可以表示声音频率范围,通过压缩PCM就是根据人耳能听到的频率来的
- 声道数(Channel):录制或播放时在不同空间位置采集或回放的相互独立的音频信号,也就是对应的音源数量和扬声器数量。
关于如何计算PCM文件的大小(例:采样率44100,位深度16,声道数2,一分钟):
文件大小=比特率×时长÷8=位深度×采样率×声道数×时间÷8=44100×16×2÷8≈10.34M
使用AudioRecord进行采集
第一步:初始化AudioRecord
AudioRecord mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,//音频源44100,//采样率AudioFormat.CHANNEL_IN_MONO,//单声道,双声道用CHANNEL_IN_STEREO//api28以上可以直接录制MP3AudioFormat.ENCODING_PCM_16BIT,//位深度为16bit的PCM文件mBufferSize //缓冲区大小,可以根据AudioRecord.getMinBufferSize()计算);
第二步:开始录制,通过全局变量isRecord进行录制控制
//启动线程进行pcm录制
class RecordThread implements Runnable {@Overridepublic void run() {mAudioRecord.startRecording();FileOutputStream fos = null;try {Log.i(TAG, "文件地址: " + mPcmFilePath);fos = new FileOutputStream(mPcmFilePath);byte[] bytes = new byte[mBufferSize];while (isRecord) {mAudioRecord.read(bytes, 0, bytes.length);fos.write(bytes, 0, bytes.length);fos.flush();}Log.i(TAG, "停止录制");mAudioRecord.stop();fos.flush();} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}}
第三步.停止录制
public void stopRecord() {isRecord = false;}
以上就是关于pcm的录制,pcm只是音频原始数据,接下来,我们将进行pcm文件转换
2.pcm文件转为WAV格式
wav:微软公司专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真。简单说,wav格式就是pcm文件加上了头信息。其头文件内容可以参考相关协议。
/*** 加入wav文件头*/private void writeWaveFileHeader(FileOutputStream out, long totalAudioLen,long totalDataLen, long longSampleRate, int channels, long byteRate)throws IOException {byte[] header = new byte[44];// RIFF/WAVE headerheader[0] = 'R';header[1] = 'I';header[2] = 'F';header[3] = 'F';header[4] = (byte) (totalDataLen & 0xff);header[5] = (byte) ((totalDataLen >> 8) & 0xff);header[6] = (byte) ((totalDataLen >> 16) & 0xff);header[7] = (byte) ((totalDataLen >> 24) & 0xff);//WAVEheader[8] = 'W';header[9] = 'A';header[10] = 'V';header[11] = 'E';// 'fmt ' chunkheader[12] = 'f';header[13] = 'm';header[14] = 't';header[15] = ' ';// 4 bytes: size of 'fmt ' chunkheader[16] = 16;header[17] = 0;header[18] = 0;header[19] = 0;// format = 1header[20] = 1;header[21] = 0;header[22] = (byte) channels;header[23] = 0;header[24] = (byte) (longSampleRate & 0xff);header[25] = (byte) ((longSampleRate >> 8) & 0xff);header[26] = (byte) ((longSampleRate >> 16) & 0xff);header[27] = (byte) ((longSampleRate >> 24) & 0xff);header[28] = (byte) (byteRate & 0xff);header[29] = (byte) ((byteRate >> 8) & 0xff);header[30] = (byte) ((byteRate >> 16) & 0xff);header[31] = (byte) ((byteRate >> 24) & 0xff);// block alignheader[32] = (byte) (2 * 16 / 8);header[33] = 0;// bits per sampleheader[34] = 16;header[35] = 0;//dataheader[36] = 'd';header[37] = 'a';header[38] = 't';header[39] = 'a';header[40] = (byte) (totalAudioLen & 0xff);header[41] = (byte) ((totalAudioLen >> 8) & 0xff);header[42] = (byte) ((totalAudioLen >> 16) & 0xff);header[43] = (byte) ((totalAudioLen >> 24) & 0xff);out.write(header, 0, 44);}
3.pcm转mp3
mp3:mp3是一种音频压缩技术,利用人耳对高频声音信号不敏感的特性,将时域波形信号转换成频域信号,并划分成多个频段,对不同的频段使用不同的压缩率。pcm转mp3,用的是开源库lame,由于相对篇幅较大,放到下一篇:https://blog.csdn.net/s591628545/article/details/104526112
参考内容:
https://www.jb51.net/article/130934.htm
项目地址:https://github.com/kingdavidsun/AudioSampling.git
Android AudioRecord录制PCM以及转换为wav和mp3相关推荐
- pcm 降采样_Android_android downsample降低音频采样频率代码,使用Android AudioRecord 录制PCM文 - phpStudy...
android downsample降低音频采样频率代码 使用Android AudioRecord 录制PCM文件,android SDK保证在所有设备上都支持的采样频率只有44100HZ, 所以如 ...
- Android 音视频开发(一) -- 使用AudioRecord 录制PCM(录音);AudioTrack播放音频
前言,音视频这块,确实比较难入门,本着学习的态度,我这边也跟着 Android 音视频开发入门指南 打怪升级,留下个脚印,大家共勉. 音视频 系列文章 Android 音视频开发(一) – 使用Aud ...
- Android使用AudioRecord录制PCM音频、PCM转AAC、使用MediaRecorder直接录制AAC编码音频
Android为我们提供了两个音频处理的API:AudioRecord和MediaRecorder AudioRecord:偏底层的api MediaRecorder:对AudioRecord进行包装 ...
- 使用FFMpeg将音频PCM数据生成WAV和MP3文件
文章目录 1. 获取编码器和创建解码器上下文 2. 创建音频流和输出封装上下文 3. 编码原始数据写入到文件中 WAV音频封装格式可以存储无编码的PCM数据,而MP3封装格式中不能直接存储PCM数据, ...
- 如何把游戏BGM文件夹中的.bank文件转换为.wav或者.mp3
如何把游戏BGM文件夹中的.bank文件转换为.wav或者.mp3 百度没搜索到,自己去google了一下,找到了很好用的工具.首先感谢两位大哥,我这里只是搬运一下. 首先将bank文件提取为fab文 ...
- 音视频开发系列(27)AudioRecord录制PCM音频
目录 音频采集API AudioRecord和MediaRecorder介绍 PCM的介绍 AudioRecord的使用(构造.开始录制.停止录制.其他细节点) ffplay播放pcm pcm转为wa ...
- 音视频开发之旅(二)AudioRecord录制PCM音频
目录 音频采集API AudioRecord和MediaRecorder介绍 PCM的介绍 AudioRecord的使用(构造.开始录制.停止录制.其他细节点) ffplay播放pcm pcm转为wa ...
- 音视频开发(二):AudioRecord录制PCM音频
目录 音频采集API AudioRecord和MediaRecorder介绍 PCM的介绍 AudioRecord的使用(构造.开始录制.停止录制.其他细节点) ffplay播放pcm pcm转为wa ...
- Android OpenSL ES 开发:Android OpenSL 录制 PCM 音频数据
一.实现说明 OpenSL ES的录音要比播放简单一些,在创建好引擎后,再创建好录音接口基本就可以录音了.在这里我们做的是流式录音,所以需要用至少2个buffer来缓存录制好的PCM数据,这里我们可以 ...
最新文章
- 【kuangbin带你飞】专题六 最小生成树
- 【已解决】mysql连接出错:ERROR 1040 (HY000): Too many connections
- 3. 软件测试的类型
- Windows上使用bat实现备份一个月内的数据库数据到文件
- Laravel表单提交419页面过期
- mysql数据库的后_MySQL数据库误删后的回复技巧
- Ansible基础概述
- LeetCode 957. N 天后的牢房(查找循环节)
- 关于tomcat启动失败的一个原因
- 那些年,我们处理过的SQL问题
- vs 外部依赖项、附加依赖项以及如何添加依赖项目
- 三、MQTT Windosw下的 进一步调试
- 【渝粤教育】国家开放大学2018年春季 0702-22T当代中国政治制度 参考试题
- 收银系统 mysql数据库_解决哗啦啦收银系统数据库备份问题
- (转发)贼牛逼的双数据源切换 赞一个 PS:关于最后事物无法切换的问题 也有解决方案 后续补上
- python五子棋双人对弈_用python实现双人五子棋(终端版)
- RabbitMQ深入学习指导
- 自考计算机专业就业率,自考计算机专业就业前景和就业选择
- 15 个优秀开源的 Spring Boot 学习项目,一网打尽!
- “燕云十六将”之Jerry葛涵涛
热门文章
- 【数通网络交换基础梳理2】三层设备、网关、ARP表、VLAN、路由表及跨网段路由下一跳转发原理
- 培训机构多如毛 国家重拳打压下为何不减反增?
- Kaggle Titanic Challenges 生存预测 数据预处理 模型训练 交叉验证 步骤详细解析
- [LOJ572] Misaka Network 与求和 [杜教筛+Min25]
- 10个最新的 Bootstrap 3 管理模板
- 解决视频的声音和画面不同步问题
- Java报错javax.net.ssl.SSLException MESSAGE: closing inbound before receiving peer‘s close_notify解决方法
- 957.N天后的牢房
- 针对U盘文件的盗与防攻略
- springBoot+mybatis实现多数据源配置