<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.RECORD_AUDIO" >一、AudioRecord实现核心代码介绍如下:
private AudioRecord audioRecord;// 录音对象private int frequence = 8000;// 采样率 8000private 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);// 实例化AudioRecordaudioRecord = 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代码实现介绍如下:
private AudioTrack track = null;// 录音文件播放对象private int frequence = 8000;// 采样率 8000private 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);// 实例AudioTracktrack = new AudioTrack(AudioManager.STREAM_MUSIC, frequence,channelInConfig, audioEncoding, bufferSize,AudioTrack.MODE_STREAM);3、使用AudioTrack播放语音数据。
//将语音数据写入即可。track.write(dataArray, buffer, len);问题一:
// 将数据通过监听接口回调出去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);}}问题二:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。