Android实现语音数据实时采集、播放

 更新时间:2016年12月09日 10:26:39   作者:LanTingShuXu  
这篇文章主要介绍了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);
  }
}


问题二:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android开发Dart Constructors构造函数使用技巧整理

    Android开发Dart Constructors构造函数使用技巧整理

    这篇文章主要为大家介绍了Android开发Dart Constructors构造函数使用技巧整理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • android Watchdog 实现剖析

    android Watchdog 实现剖析

    Android提供了Watchdog类,用来监测Service是否处于正常工作中,是在SystemServer中启动的;本文将详细介绍
    2012-11-11
  • Android 微信摇一摇功能实现详细介绍

    Android 微信摇一摇功能实现详细介绍

    这篇文章主要介绍了Android 微信摇一摇功能实现详细介绍的相关资料,并附实例代码及实现微信摇一摇的思路,需要的朋友可以参考下
    2016-11-11
  • Android中模仿抖音加载框之两颗小球转动效果

    Android中模仿抖音加载框之两颗小球转动效果

    这篇文章主要介绍了Android仿抖音加载框之两颗小球转动控件,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Android14(U)适配攻略

    Android14(U)适配攻略

    本文主要介绍了Android14(U)适配攻略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Android仿支付宝支付密码输入框

    Android仿支付宝支付密码输入框

    这篇文章主要为大家详细介绍了Android仿支付宝支付密码输入框的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android 自定义ProgressDialog进度条对话框用法详解

    Android 自定义ProgressDialog进度条对话框用法详解

    ProgressDialog为进度对话框。android手机自带的对话框显得比较单一,我们可以通过ProgressDialog来自己定义对话框中将要显示出什么东西
    2016-01-01
  • Android计算器简单逻辑实现实例分享

    Android计算器简单逻辑实现实例分享

    这篇文章主要介绍了Android计算器简单逻辑实现实例,有需要的朋友可以参考一下
    2014-01-01
  • Android中EditText光标在4.0中的bug及解决方法

    Android中EditText光标在4.0中的bug及解决方法

    这篇文章主要介绍了Android中EditText光标在4.0中的bug及解决方法,简单分析了Android4.0版本中EditText光标消息的原因及相应的解决方法,需要的朋友可以参考下
    2016-01-01
  • Android中ListView Item布局优化技巧

    Android中ListView Item布局优化技巧

    这篇文章主要介绍了Android中ListView Item布局优化技巧,以实例形式分析了ListView Item布局的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10

最新评论