热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

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

记得申明权限:

一、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

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

}

}

问题二:

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

eb74929908dadd4dfff1f010d40babf4.png

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



推荐阅读
author-avatar
mmm3310245179
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有