【android开发】实现语音数据实时采集/播放
今天无意中看到一篇关于android实现语音数据实时采集/播放的文章,感觉写得非常棒,挺全面的,所以特地转载了,还有其实还可以根据这篇博客内容考虑下视频数据实时采集、播放的实现。博客原文地址http://blog.csdn.net/lantingshuxu/article/details/53520316
最近做的项目是和语音实时采集并发送,对方实时接收并播放相关,下面记录下实现的核心代码。
很多Android开发者应该知道android有个MediaRecorder对象和MediaPlayer对象,用于录制和播放音频。这个弊端在于他们不能实时采集并发送出去,所以,我们只能使用AudioRecord和AudioTrack来实现。
记得申明权限:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" >
- 1
- 2
- 1
- 2
一、AudioRecord实现核心代码介绍如下:
1、先申明相关录制配置参数
private AudioRecord audioRecord;// 录音对象
private int frequence = 8000;// 采样率 8000
private int channelInConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;// 定义采样通道
private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;// 定义音频编码(16位)
private byte[] buffer = null;// 录制的缓冲数组
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
2、在开始录制前,我们需要初始化AudioRecord类。
// 根据定义好的几个配置,来获取合适的缓冲大小
// int bufferSize = 800;
int bufferSize = AudioRecord.getMinBufferSize(frequence,channelInConfig, audioEncoding);
// 实例化AudioRecord
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,frequence, channelInConfig, audioEncoding, bufferSize);
// 定义缓冲数组
buffer = new byte[bufferSize];
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3、准备开始录制,使用循环不断读取数据。
audioRecord.startRecording();// 开始录制
isRecording = true;// 设置录制标记为true// 开始录制
while (isRecording) {
// 录制的内容放置到了buffer中,result代表存储长度
int result = audioRecord.read(buffer, 0, buffer.length);
/*.....result为buffer中录制数据的长度(貌似基本上都是640)。
剩下就是处理buffer了,是发送出去还是直接播放,这个随便你。*/
}//录制循环结束后,记得关闭录制!!
if (audioRecord != null) {audioRecord.stop();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
二、AudioTrack代码实现介绍如下:
1、声明播放相关配置。
private AudioTrack track = null;// 录音文件播放对象
private int frequence = 8000;// 采样率 8000
private int channelInConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;// 定义采样通道
private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;// 定义音频编码(16位)
private int bufferSize = -1;// 播放缓冲大小
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
2、初始化AudioTrack对象(初始化一次,该对象可重复使用)
// 获取缓冲 大小
bufferSize = AudioTrack.getMinBufferSize(frequence, channelInConfig,audioEncoding);
// 实例AudioTrack
track = new AudioTrack(AudioManager.STREAM_MUSIC, frequence,channelInConfig, audioEncoding, bufferSize,AudioTrack.MODE_STREAM);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
3、使用AudioTrack播放语音数据。
//将语音数据写入即可。
track.write(dataArray, buffer, len);
- 1
- 2
- 1
- 2
问题一:
由于目前的项目是实时采集,实时发送,所以需要考虑到包的大小,经测试,我们使用160个byte作为一个包传递可以做到比较良好的播放效果(也就是将一份buffer拆分成四个发送)。处理代码如下:
// 将数据通过监听接口回调出去
if (audioRecordingCallback != null) {int offset = result % MAX_DATA_LENGTH > 0 ? 1 : 0;//将一个buffer拆分成几份小数据包 MAX_DATA_LENGTH 为包的最大byte数for (int i = 0; i < result / MAX_DATA_LENGTH + offset; i++) {int length = MAX_DATA_LENGTH;if ((i + 1) * MAX_DATA_LENGTH > result) {length = result - i * MAX_DATA_LENGTH;}//写到回调接口audioRecordingCallback.onRecording(buffer, i* MAX_DATA_LENGTH, length);}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
问题二:
有时候传输的过来播放声音会一卡一卡的,为了解决这样的问题,暂时使用了语音双缓冲机制来解决,问题优化很明显。代码和示意图如下:
【android开发】实现语音数据实时采集/播放相关推荐
- java录音程序_record类完成语音信号采集的任务_Android实现语音数据实时采集、播放...
最近做的项目是和语音实时采集并发送,对方实时接收并播放相关,下面记录下实现的核心代码. 很多Android开发者应该知道android有个MediaRecorder对象和MediaPlayer对象,用 ...
- 多路视频数据实时采集系统设计与实现
多路视频数据实时采集系统设计与实现 常永亮 王霖萱 常馨蓉 摘要 面对越来越多的实时视频采集.播放的应用,如何能更加方便的操控视频采集,保证流畅的播放效果,成为近几年实时媒体流的一个重要研究方向 ...
- Android开发本地及网络Mp3音乐播放器(二十)歌曲下载完成后通知主界面更新本地音乐
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51448597 项目源码(打赏5积分请点这边):http://download.csdn ...
- android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...
本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...
- android开发中磁场传感器,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...
本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...
- android app数据存储,基于Android开发的APP数据存储研究
谢原武+龙文 摘要: 作为一个完整的应用程序,数据存储操作是必不可少的.Android系统一共提供了四种数据存储方式分别为File文件存储.Shared Preferences存储.ContentPr ...
- Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51290181 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现NetM ...
- Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51298411 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现网络音乐 ...
- 2路 QSFP,40G 光纤的数据实时采集(5GByte/s 带宽)板卡设计原理图 -PCIE732
板卡概述 PCIE732 是一款基于 PCIE 总线架构的高性能数据传输卡,板卡具有 1 个 PCIex8 主机接口.2 个 QSFP+40G 光纤接口,可以实现 2 路 QSFP+ 40G 光纤的 ...
- android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...
在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23 作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...
最新文章
- 力扣—— 三维形体投影面积
- Java 多线程 之 银行ATM实例
- usaco Superprime Rib 搜索
- 优化CSS在网页中的加载方式
- WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...
- django批量form表单处理
- 服务器配置PHP系统,php用什么系统做服务器配置
- [C++ rudiment][转]typedef 使用
- 【运筹与优化】单纯形法解线性规划问题(matlab实现)
- linux命令:watch 、lsmod、mdadm 创建软RAID
- 苹果这个酷炫的项目要流产了?市场未爆发或成主因
- python基础代码技巧_写Python必须知道的这几个代码技巧!你会吗?
- 算法----并行算法
- 12款Javascript表格控件(DataGrid)
- oracle 模式_Oracle实验--insert /*+APPEND*/与insert不同模式下产生redo大小
- 在浏览器环境下,用Excel.js读取excel文件
- php手机号批量分类,一个非常好的php实现手机号归属地查询接口类
- Spring源码解析一 (IOC容器初始化深度解析)
- Vasp 石墨烯能带计算
- 手把手教你用JAVA实现“语音识别”功能(声音转文字)标贝科技