【android开发】实现语音数据实时采集/播放

最近做的项目是和语音实时采集并发送,对方实时接收并播放相关,下面记录下实现的核心代码。

很多android开发者应该知道android有个MediaRecorder对象和MediaPlayer对象,用于录制和播放音频。这个弊端在于他们不能实时采集并发送出去,所以,我们只能使用AudioRecord和AudioTrack来实现。

记得申明权限:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" >

一、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;// 录制的缓冲数组

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];

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();
}

二、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;// 播放缓冲大小

2、初始化AudioTrack对象(初始化一次,该对象可重复使用)

// 获取缓冲 大小
bufferSize = AudioTrack.getMinBufferSize(frequence, channelInConfig,
        audioEncoding);
// 实例AudioTrack
track = new AudioTrack(AudioManager.STREAM_MUSIC, frequence,
        channelInConfig, audioEncoding, bufferSize,
        AudioTrack.MODE_STREAM);

3、使用AudioTrack播放语音数据。

//将语音数据写入即可。
track.write(dataArray, buffer, len);


问题一:

由于目前的项目是实时采集,实时发送,所以需要考虑到包的大小,经测试,我们使用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);
    }
}

问题二:

有时候传输的过来播放声音会一卡一卡的,为了解决这样的问题,暂时使用了语音双缓冲机制来解决,问题优化很明显。代码和示意图如下:

时间: 2024-10-12 13:05:53

【android开发】实现语音数据实时采集/播放的相关文章

Android开发之使用BroadcastReceiver实时监听电量(源代码分享)

Android系统中实时的监听手机电量以及开机启动功能都是通过BroadcastReceiver组件实现的.我们可以动态注册这个类的一个实例通过Context.registerReceiver()方法或者静态注册,通过<Receiver>标记在androidmanifest . xml.注意:如果我们注册一个接收器在Activity.onResume()实现,我们应该注销Activity在Activity生命周期的onPause方法中.(这将减少不必要的系统开销).切记不能注销Activity

Android开发系列之数据存储(一)

  Android开发中,数据存储主要有五种:网络.数据库.SharePreferences.文件以及Content Provider.   . 数据库    Android中的数据库最常用的是Sqlite. 使用Sqlite进行数据存储,可分为以下几步:    . 继承SqliteOpenHelper    . 整理4个构造方法    . 重写onCreate与onUpgrade      public class DownDBHelper extends SQLiteOpenHelper {

Android开发本地及网络Mp3音乐播放器(十)最近播放界面与数据保存更新

实现功能: 实现MyLoveMusicActivity(音乐收藏界面) 实现MyRecordMusicActivity(最近播放界面) 实现MyMusicListFragment(本地音乐界面)ItemClick事件发生后,切换到PlayActivity(独立音乐播放界面)只播放 本地音乐. 实现MyLoveMusicActivity(音乐收藏界面)ItemClick事件发生后,切换到PlayActivity(独立音乐播放界面)只播放 音乐收藏. 实现MyRecordMusicActivity(

语音信号实时采集与处理

<一>基于MATLAB的语音信号采集和分析系统的可视化设计 论文摘要:设计和开发了一种基于MATLAB的语音采集与分析的可视化系统,该系统通过Realtek Ac97型声卡和MATLAB的数据采集工具箱低成本地实现了语音信号的实时采集,并利用 MATLAB 强大的数值计算和信号处理功能高精度地完成了语音信号的分析工作.系统还使用 MATLAB 的图形用户界面设计工具进行了优化,通过简单的对话框和菜单操作取代了复杂的程序修改和调试过程,使得系统的使用更加方便灵活. 论文理解:系统主要包括语音采集

Android开发笔记之: 数据存储方式详解

无论是神马平台,神马开发环境,神马软件程序,数据都是核心.对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用.总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等:网络,则用于比较重要的事情,比如科研,勘探,航空等实时采集到的数据需要马上通过网络

Android开发本地及网络Mp3音乐播放器(九)音乐收藏与列表切换

实现功能: 使用快速开发框架xUtils中的DbUtils模块,为音乐收藏功能做准备 实现PlayActivity(独立音乐播放界面)收藏.取消收藏按钮 实现MainActivity(主界面)菜单选择事件进入MyLoveMusicActivity(音乐收藏界面) 实现本地音乐列表与音乐收藏列表切换功能 (目前源码,只实现了音乐收藏列表,菜单中最近播放列表后续会进行补充) 截止到目前的源码下载: http://download.csdn.net/detail/iwanghang/9504916 x

Android开发系列之数据存储(二)

上一篇记载了Android开发数据库与Sharepreferences的基本使用,该篇主要讲述下文件的存储方式.   .文件    文件存储方式在Android开发中几乎是必不可少的,常用的文件磁盘缓存,字符串文件缓存以及xml文件缓存等. .文件读写 文件的读写主要有几种:多媒体文件以流的形式,文本文件以字符串的形式等. .将流写入文件 /** * 将InputStream保存到文件 * * @param context * @param in * @param fileLength * @p

Android开发-API指南-数据存储

Storage Options 英文原文:http://developer.android.com/guide/topics/data/data-storage.html 采集日期:2015-02-06 存储方式概述 用于简单数据的 Shared Preference 用于私有数据的内部存储 用于大型公开数据的外部存储 用于结构化数据的 SQLite 数据库 在本文中 使用 Shared Preference 使用内部存储 使用外部存储 使用数据库 使用网络连接 参阅 Content Provi

android开发系列之数据存储

在我们的android实际开发过程,必不可少的一种行为操作对象就是数据.有些数据,对于用户而言是一次性的,这就要求我们每次进到App的时候,都需要去刷新数据.有些数据,对于用户而言又是具有一定时效性的,比如用户账号数据.这种情况下,就要求我们采用一定的数据保存措施,在这篇博客里面,我将为大家分享一些android里面常用的数据保存方法. 首先在android里面我们用的比较多的小数量存储方式可能就是SharedPreferences,那么什么是SharedPreferences呢?为了保存软件的