Android实现语音数据实时采集、播放_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采集语音
android 实时视频采集、qt实现实时语音聊天、实时语音聊天功能实现、ios 实时语音实现、android 实时语音,以便于您获取更多的相关知识。

时间: 2025-01-30 08:11:53

Android实现语音数据实时采集、播放_Android的相关文章

Android解析JSON数据的方法分析_Android

本文实例讲述了Android解析JSON数据的方法.分享给大家供大家参考,具体如下: JSON作为一种"轻量"的数据结构传递数据,在JS中有广泛的应用 Google公司对JSON的解析提供了gson.jar这个包,它不依赖于其他任何JAR包:自从Android3.0中已经合入了该解析器的功能,但之前的版本是没有的. findViewById(R.id.parseBtn).setOnClickListener(new OnClickListener(){ @Override public

Android系列---JSON数据解析的实例_Android

上篇随笔详细介绍了三种解析服务器端传过来的xml数据格式,而对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三种格式,那么本篇随笔将讲解一下json这个知识点,包括如何通过json-lib和gson这两个json解析库来对解析我们的json数据,以及如何在我们的Android客户端解析来自服务器端的json数据,并更新到UI当中. 一.什么是json json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格

Android与JS数据实时交互例子

废话不多说,直接上代码: private WebView mWebView; mWebView.getSettings().setJavaScriptEnabled(true);//这个没的说,首先得支持js mWebView.loadUrl("www.111cn.net"); mWebView.addJavascriptInterface(new MyJavascriptInterface(this), "imagelistner");//自定义一个MyJavas

使用LogHub进行日志实时采集

日志服务LogHub功能提供日志数据实时采集与消费,其中实时采集功能支持30+种手段,这里简单介绍下各场景的接入方式. 数据采集一般有两种方式,区别如下.我们这里主要讨论通过LogHub流式导入(实时)采集. 方式 优势 劣势 例子 批量导入 吞吐率大,面向历史存量数据 实时性较差 FTP.OSS上传.邮寄硬盘.SQL数据导出 流式导入 实时,所见即所得,面向实时数据 收集端要求高 LogHub.HTTP上传.IOT,Queue 背景 "我要点外卖"是一个平台型电商网站,用户.餐厅.配

编码-android 语音实时原始通话 语音数据用什么编解码?

问题描述 android 语音实时原始通话 语音数据用什么编解码? android 局域网实时通话,如果直接录音,发送,播放,音频是原始的Pcm数据,会有噪音.所以语音数据要再次编码再发送.那么问题来了,用什么编解码方案? 解决方案 用silk来处理编码吧

socket-android音频实时采集 传输到PC端播放

问题描述 android音频实时采集 传输到PC端播放 android音频实时采集 传输到PC端播放 服务端是用c写的,客户端通过Socket向服务端传递数据 问题是这样的: (1)开启两个线程,线程A,线程B. (2)建立100个bufffer,每个的大小为4k,线程A通过AudioRecod不断向100个buffer里面写入数据,写满100个后,再从头开始写(覆盖掉原来写的). (3)线程B从上面的100个buffer里面不断读取数据,并将这些数据传递(socket___tcp)到服务端(p

线程-android怎么实现蓝牙实时接收数据 inputstream

问题描述 android怎么实现蓝牙实时接收数据 inputstream 2C 现在在做一个APP 单片机通过蓝牙模块 将数据发送到手机上并显示现在搜索蓝牙 配对 连接都没问题但是做到接收数据这一步的时候遇到了一些问题首先是 调用inputstream函数的时候 程序会阻塞(我也看了资料说是放到线程里 但是放进去之后 却不能实时接收了 或者说是不能接收完全)然后是 我想设置一个 开始接收的按钮 按一下就开始自动接收 再按另一个就停止接收 然后这一部分又怎么实现 有没有大神可以帮我?求助!(我现在

C#串口通信和以太网通讯 实时采集下位机的电压、电流、温度等多路数据

问题描述 请教各位大神,我需要用vsc#,实时采集下位机的电压.电流.温度等多路数据,以便后续的界面开发.求教各位大神能不能用串口或以太网通讯实现?具体的学习内容和步骤是怎样的?不甚感激,万谢,万谢! 解决方案 解决方案二:实时采集下位机的电压.电流.温度等多路数据下位机有接口给你吗?或者会实时发送数据出来吗?解决方案三:谢谢您的回复.是的,下位机连有接口,我要怎么通过以太网通讯给下位机发读指令读取数据,实现实时采集?另外,请问学习IEC60870-5-101/104的侧重点在哪里?最好有以太网

Android编程实现WebView全屏播放的方法(附源码)_Android

本文实例讲述了Android编程实现WebView全屏播放的方法.分享给大家供大家参考,具体如下: 最近因为项目要用webview加载html5的视频,开始不能全屏播,做了很久才做出来!那按我的理解说下怎么实现全屏吧. 首先写布局文件activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.