最近做的项目是和语音实时采集并发送,对方实时接收并播放相关,下面记录下实现的核心代码。
很多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音频开发之音频采集的实现示例的使用技巧和注意事项,需要的朋友参考一下 在 Android 系统中,一般使用 AudioRecord 或者 MediaRecord 来采集音频。 AudioRecord 是一个比较偏底层的API,它可以获取到一帧帧 PCM 数据,之后可以对这些数据进行处理。 而 MediaRecorder
本文向大家介绍android语音即时通讯之录音、播放功能实现代码,包括了android语音即时通讯之录音、播放功能实现代码的使用技巧和注意事项,需要的朋友参考一下 在android中,实现录音与语音播放的功能算是比较简单的,但是作为参考,还是很有必要将语音相关的知识做一个简要的记录。 首先,在android中,支持录音支持两种方式。主要包括:字节流模式和文件流模式。用文件流模式进行录音操作比较简单
本文向大家介绍android实现简单音乐播放器,包括了android实现简单音乐播放器的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已。因为我们Andoird课程要求写一个音乐播放器。所以就有了此项目。这个项目比较简单,实现了最基本的音乐播放功能,然后界面是仿照着网易云
本文向大家介绍Android实现简单音乐播放器(MediaPlayer),包括了Android实现简单音乐播放器(MediaPlayer)的使用技巧和注意事项,需要的朋友参考一下 Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要
本文向大家介绍Android实现简单音乐播放控件,包括了Android实现简单音乐播放控件的使用技巧和注意事项,需要的朋友参考一下 之前看到网页版的网易音乐播放控件, 正好在一个开源学习项目中需要简单的音乐播放功能。所以想是不是可以封装一个音乐播放控件,提供一个类似网易播放控件的默认界面,而且提供更换界面的功能。使用时,只需要去设计界面, 而不用再去管音乐播放的逻辑,所以就实现了一个简单的音乐播放
本文向大家介绍Android实现多媒体之播放音乐,包括了Android实现多媒体之播放音乐的使用技巧和注意事项,需要的朋友参考一下 闲来无聊,最近了解了一下多媒体的一些初步知识。 音频播放主要设计到MediaPlayer这个类,播放音频的路径可以来源于三个地方。 1.应用内的音频 2. 播放内存卡里的音乐,这一部分代码就是替换前面的mediaPlayer = MediaPlayer.create