技术领域
[0001] 本
发明涉及Android技术领域,特别涉及一种基于Android实现边说边上传语音的方法。
背景技术
[0002] 随着
移动通信网络的快速发展,以及智能应用
软件的快速普及,手机对人们来说不再只是简单的通讯工具,而是成了生活中必不可少的伴侣,可以用它跟朋友进行语音对话、面对面的视频
聊天、一起玩游戏以及一起学习等等有意思的活动。
[0003] 谈起语音对话功能,目前大部份流行的社交APP还是采用的是录制完毕后再发送给对方的方法,虽然此方法能让对方收到语音,但并不能让对方知道你在及时回答他的过程中。如果你要说的话很长,对方就会觉得您没有在回复他,而去做其它的事情去了,这样一来,就没有形成有效的沟通。
[0004] 本发明主要是针对以上问题,通过边聊天,边采集,边上传的技术手段,实现了语音聊天时动态快速回复的目的。
发明内容
[0005] 本发明解决的技术问题在于提供一种基于Android实现边说边上传语音的方法;本发明解决了语音录制完毕后上传文件过大,上传缓慢,对方不能及时收到消息的问题。
[0006] 本发明解决上述技术问题的技术方案是:一、在项目中引入百度语音支持包并配置相关权限;二、实现录音录制功能,进行录音;
三、将获取到的音频数据流进行编码;四、将编码好的数据写入到文件中,生成音频文件;
五、将音频文件分片上传到文件
服务器上,未上传成功则录完整个上传;六、将音频文件地址发送给消息服务器,由消息服务器路由到接收方;七、用户手机接收到消息服务器的
回执,
请求文件服务器,对数据进行解码,还原语音。
[0007] 所述的方法具体包括如下步骤:步骤一、在项目中引入百度语音支持包并配置相关权限;
步骤二、实现录音录制功能,进行录音,所述的具体实现:1、创建录音布局文件;2、根据布局创建对应的Activity;3、在Activity中初始化录音对象;4、添加按钮监听事件;5、在按钮监听事件中,进行语音的录制与采集;
步骤三、将获取到的音频数据流进行AAC编码,采用AAC编码可以实现高压缩比,比一般的好很多,而且音频不失真;
步骤四、将编码好的数据写入到文件中,生成音频文件;
步骤五、将音频文件分段上传文件服务器,判断每一段是否上传成功,如果没上传成功,再判断是否是最后一段语音,如果是则进行合并,否则上传整个语音。
[0008] 步骤六、将音频文件地址发送给消息服务器,由消息服务器路由到接收方;步骤七、用户手机接收到消息服务器的回执,请求文件服务器,对数据进行解码,还原语音。
[0009] 本发明的有益效果:通过边聊天,边采集,边上传的技术手段,实现了语音聊天时动态快速回复的目的。有效地解决了语音录制完毕后上传文件过大,上传缓慢,对方不能及时收到消息的问题。
附图说明
[0010] 下面结合附图对本发明进一步说明:图1为本发明的
流程图。
具体实施方式
[0011] 如图1所示,本发明采用如下步骤:步骤一、在项目中引入百度语音支持包并配置相关权限;
1)AndroidManifest.xml配置
2)Application配置
StringBuffer param = new StringBuffer();
param.append("appid="+getString(R.string.app_id));
param.append(",");
param.append(Const.ENGINE_MODE+"="+Const.MODE_MSC);
SpeechUtility.createUtility(SpeechApp.this, param.toString());
步骤二、实现录音录制功能,进行录音,所述的具体实现:1、创建录音布局文件;2、根据布局创建对应的Activity;3、在Activity中初始化录音对象;4、添加按钮监听事件;5、在按钮监听事件中,进行语音的录制与采集;如:
public class MainActivity extends Activity implements OnClickListener {
// 多媒体录制器
private MediaRecorder mediaRecorder = new MediaRecorder();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获得三个按钮的UI控件
Button btnStart = (Button) findViewById(R.id.btnStart);
btnStart.setOnClickListener(this);
}
@Override
public void onClick(View view) {
try {
switch (view.getId()) {
// 开始录音
case R.id.btnStart:
// 准备并且开始启动录制器
mediaRecorder.prepare();
mediaRecorder.start();
break;
}
}
三、将获取到的音频数据流进行AAC编码,采用AAC编码可以实现高压缩比,比一般的好很多,而且音频不失真;如:
private void encodeAAC(byte[] data) {
int inputBufferIndex = mEncoder.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = mEncoder.getInputBuffer(inputBufferIndex);
inputBuffer.clear();
inputBuffer.put(data);
inputBuffer.limit(data.length);
mEncoder.queueInputBuffer(inputBufferIndex, 0, data.length,
System.nanoTime(), 0);
}
int outputBufferIndex = mEncoder.dequeueOutputBuffer
(mBufferInfo, 0);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = mEncoder.getOutputBuffer(outputBufferIndex);
//给adts头字段空出7的字节
int length=mBufferInfo.size+7;
if(mFrameByte==null||mFrameByte.length mFrameByte=new byte[length];
}
addADTStoPacket(mFrameByte,length);
outputBuffer.get(mFrameByte,7,mBufferInfo.size);
}
}
四、将编码好的数据写入到文件中,生成音频文件;如:
String tmpName = System.currentTimeMillis() + "_" + mSampleRateInHZ + "";
final File tmpFile = createFile(tmpName + ".pcm");
final File tmpOutFile = createFile(tmpName + ".wav");
mTmpFileAbs = tmpFile.getAbsolutePath();
mLogTv.setText(tmpFile.getAbsolutePath());
isRecording = true;
mAudioRecord.startRecording();
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
FileOutputStream outputStream = new FileOutputStream
(tmpFile.getAbsoluteFile());
while (isRecording) {
int readSize = mAudioRecord.read(mAudioData, 0, mAudioData.length);
outputStream.write(mAudioData);
}
outputStream.close();
pcmToWave(tmpFile.getAbsolutePath(),
tmpOutFile.getAbsolutePath());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
五、将音频文件分段上传文件服务器,判断每一段是否上传成功,如果没上传成功,再判断是否是最后一段语音,如果是则进行合并,否则上传整个语音;如:
private void audioUpLoad() {
new Thread() {
public void run() {
// post请求上传
HttpClient httpclient = new DefaultHttpClient();
HttpPost post = new HttpPost("...");
FileBody fileBody = new FileBody(audioFile);
try {
StringBody stringBody = new StringBody("...");
MultipartEntity entity = new MultipartEntity();
entity.addPart("file", fileBody);
entity.addPart("desc", stringBody);
post.setEntity(entity);
HttpResponse response = httpclient.execute(post);
if (HttpStatus.SC_OK == response.getStatusLine()
.getStatusCode()) {
HttpEntity entitys = response.getEntity();
if (entity != null) {
}
}
} catch (Exception e) {
e.printStackTrace();
}
httpclient.getConnectionManager().shutdown();
};
}.start();
}
步骤六、将音频文件地址发送给消息服务器,由消息服务器路由到接收方;如:
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
String showMessage = "";
switch (msg.what) {
case UPLOAD_SUCCESS:
notifyUser(msg);
showMessage = "录音文件上传成功!";
break;
case UPLOAD_FAIL:
showMessage = "录音文件上传失败!";
break;
}
};
};
步骤七、用户手机接收到消息服务器的回执,请求文件服务器,对数据进行解码,还原语音。