今天无意中看到一篇关于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开发】实现语音数据实时采集/播放相关推荐

  1. java录音程序_record类完成语音信号采集的任务_Android实现语音数据实时采集、播放...

    最近做的项目是和语音实时采集并发送,对方实时接收并播放相关,下面记录下实现的核心代码. 很多Android开发者应该知道android有个MediaRecorder对象和MediaPlayer对象,用 ...

  2. 多路视频数据实时采集系统设计与实现

    多路视频数据实时采集系统设计与实现 常永亮   王霖萱  常馨蓉 摘要 面对越来越多的实时视频采集.播放的应用,如何能更加方便的操控视频采集,保证流畅的播放效果,成为近几年实时媒体流的一个重要研究方向 ...

  3. Android开发本地及网络Mp3音乐播放器(二十)歌曲下载完成后通知主界面更新本地音乐

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51448597 项目源码(打赏5积分请点这边):http://download.csdn ...

  4. android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...

  5. android开发中磁场传感器,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...

  6. android app数据存储,基于Android开发的APP数据存储研究

    谢原武+龙文 摘要: 作为一个完整的应用程序,数据存储操作是必不可少的.Android系统一共提供了四种数据存储方式分别为File文件存储.Shared Preferences存储.ContentPr ...

  7. Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51290181 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现NetM ...

  8. Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51298411 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现网络音乐 ...

  9. 2路 QSFP,40G 光纤的数据实时采集(5GByte/s 带宽)板卡设计原理图 -PCIE732

    板卡概述  PCIE732 是一款基于 PCIE 总线架构的高性能数据传输卡,板卡具有 1 个 PCIex8 主机接口.2 个 QSFP+40G 光纤接口,可以实现 2 路 QSFP+ 40G 光纤的 ...

  10. android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...

    在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23   作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...

最新文章

  1. 力扣—— 三维形体投影面积
  2. Java 多线程 之 银行ATM实例
  3. usaco Superprime Rib 搜索
  4. 优化CSS在网页中的加载方式
  5. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...
  6. django批量form表单处理
  7. 服务器配置PHP系统,php用什么系统做服务器配置
  8. [C++ rudiment][转]typedef 使用
  9. 【运筹与优化】单纯形法解线性规划问题(matlab实现)
  10. linux命令:watch 、lsmod、mdadm 创建软RAID
  11. 苹果这个酷炫的项目要流产了?市场未爆发或成主因
  12. python基础代码技巧_写Python必须知道的这几个代码技巧!你会吗?
  13. 算法----并行算法
  14. 12款Javascript表格控件(DataGrid)
  15. oracle 模式_Oracle实验--insert /*+APPEND*/与insert不同模式下产生redo大小
  16. 在浏览器环境下,用Excel.js读取excel文件
  17. php手机号批量分类,一个非常好的php实现手机号归属地查询接口类
  18. Spring源码解析一 (IOC容器初始化深度解析)
  19. Vasp 石墨烯能带计算
  20. 手把手教你用JAVA实现“语音识别”功能(声音转文字)标贝科技

热门文章

  1. 找不到minidump.dmp文件
  2. wpsa4排版_WPS2000如何快速排版
  3. 最全的Android源码目录结构详解【转】
  4. 计算机图形学——计算机图形系统及硬件基础
  5. 复试c语言笔试题,考研计算机复试(C语言复试笔试题)(精华题选)
  6. redhat官网关于生成rpm包的文章
  7. 抱薪者说 | 廿七喜得子老王为名忧,论坛聚英豪树鑫拔头筹
  8. 软件工程工具图(软件开发过程中可能用到的工具图)
  9. 电子扫描阵列雷达的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. rp软件app流程图_AxureRP介绍