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相关推荐

  1. pcm 降采样_Android_android downsample降低音频采样频率代码,使用Android AudioRecord 录制PCM文 - phpStudy...

    android downsample降低音频采样频率代码 使用Android AudioRecord 录制PCM文件,android SDK保证在所有设备上都支持的采样频率只有44100HZ, 所以如 ...

  2. Android 音视频开发(一) -- 使用AudioRecord 录制PCM(录音);AudioTrack播放音频

    前言,音视频这块,确实比较难入门,本着学习的态度,我这边也跟着 Android 音视频开发入门指南 打怪升级,留下个脚印,大家共勉. 音视频 系列文章 Android 音视频开发(一) – 使用Aud ...

  3. Android使用AudioRecord录制PCM音频、PCM转AAC、使用MediaRecorder直接录制AAC编码音频

    Android为我们提供了两个音频处理的API:AudioRecord和MediaRecorder AudioRecord:偏底层的api MediaRecorder:对AudioRecord进行包装 ...

  4. 使用FFMpeg将音频PCM数据生成WAV和MP3文件

    文章目录 1. 获取编码器和创建解码器上下文 2. 创建音频流和输出封装上下文 3. 编码原始数据写入到文件中 WAV音频封装格式可以存储无编码的PCM数据,而MP3封装格式中不能直接存储PCM数据, ...

  5. 如何把游戏BGM文件夹中的.bank文件转换为.wav或者.mp3

    如何把游戏BGM文件夹中的.bank文件转换为.wav或者.mp3 百度没搜索到,自己去google了一下,找到了很好用的工具.首先感谢两位大哥,我这里只是搬运一下. 首先将bank文件提取为fab文 ...

  6. 音视频开发系列(27)AudioRecord录制PCM音频

    目录 音频采集API AudioRecord和MediaRecorder介绍 PCM的介绍 AudioRecord的使用(构造.开始录制.停止录制.其他细节点) ffplay播放pcm pcm转为wa ...

  7. 音视频开发之旅(二)AudioRecord录制PCM音频

    目录 音频采集API AudioRecord和MediaRecorder介绍 PCM的介绍 AudioRecord的使用(构造.开始录制.停止录制.其他细节点) ffplay播放pcm pcm转为wa ...

  8. 音视频开发(二):AudioRecord录制PCM音频

    目录 音频采集API AudioRecord和MediaRecorder介绍 PCM的介绍 AudioRecord的使用(构造.开始录制.停止录制.其他细节点) ffplay播放pcm pcm转为wa ...

  9. Android OpenSL ES 开发:Android OpenSL 录制 PCM 音频数据

    一.实现说明 OpenSL ES的录音要比播放简单一些,在创建好引擎后,再创建好录音接口基本就可以录音了.在这里我们做的是流式录音,所以需要用至少2个buffer来缓存录制好的PCM数据,这里我们可以 ...

最新文章

  1. 【kuangbin带你飞】专题六 最小生成树
  2. 【已解决】mysql连接出错:ERROR 1040 (HY000): Too many connections
  3. 3. 软件测试的类型
  4. Windows上使用bat实现备份一个月内的数据库数据到文件
  5. Laravel表单提交419页面过期
  6. mysql数据库的后_MySQL数据库误删后的回复技巧
  7. Ansible基础概述
  8. LeetCode 957. N 天后的牢房(查找循环节)
  9. 关于tomcat启动失败的一个原因
  10. 那些年,我们处理过的SQL问题
  11. vs 外部依赖项、附加依赖项以及如何添加依赖项目
  12. 三、MQTT Windosw下的 进一步调试
  13. 【渝粤教育】国家开放大学2018年春季 0702-22T当代中国政治制度 参考试题
  14. 收银系统 mysql数据库_解决哗啦啦收银系统数据库备份问题
  15. (转发)贼牛逼的双数据源切换 赞一个 PS:关于最后事物无法切换的问题 也有解决方案 后续补上
  16. python五子棋双人对弈_用python实现双人五子棋(终端版)
  17. RabbitMQ深入学习指导
  18. 自考计算机专业就业率,自考计算机专业就业前景和就业选择
  19. 15 个优秀开源的 Spring Boot 学习项目,一网打尽!
  20. “燕云十六将”之Jerry葛涵涛

热门文章

  1. 【数通网络交换基础梳理2】三层设备、网关、ARP表、VLAN、路由表及跨网段路由下一跳转发原理
  2. 培训机构多如毛 国家重拳打压下为何不减反增?
  3. Kaggle Titanic Challenges 生存预测 数据预处理 模型训练 交叉验证 步骤详细解析
  4. [LOJ572] Misaka Network 与求和 [杜教筛+Min25]
  5. 10个最新的 Bootstrap 3 管理模板
  6. 解决视频的声音和画面不同步问题
  7. Java报错javax.net.ssl.SSLException MESSAGE: closing inbound before receiving peer‘s close_notify解决方法
  8. 957.N天后的牢房
  9. 针对U盘文件的盗与防攻略
  10. springBoot+mybatis实现多数据源配置