类似微信说话功能的录音处理代码分享
packagecom.example.testaudio;
importjava.io.File;
importandroid.app.Activity;
importandroid.media.MediaPlayer;
importandroid.media.MediaPlayer.OnCompletionListener;
importandroid.media.MediaRecorder;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.util.Log;
importandroid.view.Menu;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.view.View.OnTouchListener;
importandroid.widget.Button;
importandroid.widget.TextView;
publicclassMainActivityextendsActivity{
privateMediaRecorderrecoder=null;
privateMediaPlayerplayer=null;
privateStringtheMediaPath;
TextViewtv=null;
TextViewtvRecord=null;
ButtontestBtn=null;
ButtontestBtn2=null;
ButtonstopBtn=null;
ButtonplayBtn=null;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView)findViewById(R.id.textView1);
tvRecord=(TextView)findViewById(R.id.tvRecord);
testBtn=(Button)findViewById(R.id.button1);
testBtn2=(Button)findViewById(R.id.button2);
stopBtn=(Button)findViewById(R.id.buttonStop);
playBtn=(Button)findViewById(R.id.buttonPlay);
testBtn2.setOnTouchListener(newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
Log.i("testactivity","setOnTouchListener:"+event.getAction());
switch(event.getAction()){
caseMotionEvent.ACTION_UP:{
Log.i("testactivity","停止录音");
stopRecording();
break;
}
caseMotionEvent.ACTION_DOWN:{
Log.i("testactivity","开始录音");
startRecording();
break;
}
default:break;
}
returnfalse;
}
});
testBtn.setOnClickListener(newOnClickListener(){
publicvoidonClick(Viewarg0){
startRecording();
testBtn.setEnabled(false);
stopBtn.setEnabled(true);
}
});
stopBtn.setEnabled(false);
stopBtn.setOnClickListener(newOnClickListener(){
publicvoidonClick(Viewarg0){
stopRecording();
testBtn.setEnabled(true);
playBtn.setEnabled(true);
stopBtn.setEnabled(false);
}
});
playBtn.setOnClickListener(newOnClickListener(){
publicvoidonClick(Viewarg0){
playRecordFile(theMediaPath);
stopBtn.setEnabled(true);
}
});
}
protectedvoidplayRecordFile(String_file){
try{
Filef=newFile(_file);
if(!f.exists()){
tv.setText("文件不存在:"+_file);
return;
}
}catch(Exceptione){
Log.i("testactivity",e.getMessage());
}
try{
player=newMediaPlayer();
player.setDataSource(_file);
player.prepare();
player.setOnCompletionListener(newOnCompletionListener(){
publicvoidonCompletion(MediaPlayerarg0){
tv.setText("播放完毕");
stopBtn.setEnabled(false);
}
});
player.start();
}catch(Exceptione){
Log.e("testactivity","playfailed:"+e.getMessage());
}
}
/**
*停止录音处理
*/
protectedvoidstopRecording(){
if(recoder!=null){
Log.i("testactivity","停止录音");
recoder.stop();
recoder.release();
recoder=null;
endtime=System.currentTimeMillis();
_handleRecordComplete();
}
if(player!=null){
Log.i("testactivity","停止播放");
player.stop();
player.release();
player=null;
}
}
/**
*开始录音处理
*/
protectedvoidstartRecording(){
theMediaPath=Environment.getExternalStorageDirectory().getAbsolutePath();
theMediaPath+="/audiotest.3gp";
recoder=newMediaRecorder();
recoder.setAudioSource(MediaRecorder.AudioSource.MIC);
recoder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recoder.setOutputFile(theMediaPath);
recoder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
starttime=System.currentTimeMillis();
updateMicStatus();
try{
recoder.prepare();
recoder.start();
_handleRecordStart();
}catch(Exceptione){
Log.e("testactivity","preparedfailed:"+e.getMessage());
_handleRecordStartError(e);
}
}
//定时器
privatestaticlongmaxtime=30*1000;//30秒
privatelongstarttime=0l;
privatelongendtime=0l;
privatefinalHandlermHandler=newHandler();
privateRunnablemUpdateMicStatusTimer=newRunnable(){
publicvoidrun(){
//判断是否超时
if(starttime>0&&System.currentTimeMillis()-starttime>maxtime){
Log.e("testactivity","超时的录音时间,直接停止");
stopRecording();
return;
}
//更新分贝状态
updateMicStatus();
}
};
/**
*更新话筒状态分贝是也就是相对响度分贝的计算公式K=20lg(Vo/Vi)Vo当前振幅值Vi基准值为600:我是怎么制定基准值的呢?当20
**Math.log10(mMediaRecorder.getMaxAmplitude()/Vi)==0的时候vi就是我所需要的基准值
*当我不对着麦克风说任何话的时候,测试获得的mMediaRecorder.getMaxAmplitude()值即为基准值。
*Log.i("mic_","麦克风的基准值:"+mMediaRecorder.getMaxAmplitude());前提时不对麦克风说任何话
*/
privateintBASE=600;
privateintSPACE=300;//间隔取样时间
privatevoidupdateMicStatus(){
if(recoder!=null){
//intvuSize=10*mMediaRecorder.getMaxAmplitude()/32768;
intratio=recoder.getMaxAmplitude()/BASE;
intdb=0;//分贝
if(ratio>1)
db=(int)(20*Math.log10(ratio));
_handleRecordVoice(db);
mHandler.postDelayed(mUpdateMicStatusTimer,SPACE);
/*
*if(db>1){vuSize=(int)(20*Math.log10(db));Log.i("mic_",
*"麦克风的音量的大小:"+vuSize);}elseLog.i("mic_","麦克风的音量的大小:"+0);
*/
}
}
privatevoid_handleRecordStart(){
//开始录音的接收函数
tv.setText("开始录音...");
//starttime开始时间
}
privatevoid_handleRecordStartError(Exceptione){
//开始录音的接收函数失败
tv.setText("开始录音失败:"+e.getMessage());
}
privatevoid_handleRecordComplete(){
//结束录音
tv.setText("停止录音:"+theMediaPath);
}
privatevoid_handleRecordVoice(int_db){
//声音事件侦听,转换成分贝
tvRecord.setText(""+_db);
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
}
相关文章
- 云服务器10行代码推送值班消息到微信公众号2021.6.9
- 【愚公系列】2022年09月 微信小程序-实现直播功能
- 【愚公系列】2022年09月 微信小程序-WebGL立体图形的绘制
- 基于 AppCube 应用魔方:零代码手把手教你 5 分钟开发微信小程序
- springboot基于微信小程序的在线办公系统+java+uinapp+Mysql
- 微信小程序批量提交后台审核~
- 3小时!开发ChatGPT微信小程序
- 不改一行代码,就可以将微信小程序转成商业App?
- 微信支付x低代码,快速构建支付类小程序实操教程
- 简单!小白0代码搭微信ChatGPT,无敌图文教程!
- 微信机器人详细介绍:素材管理
- java版+支付宝支付和微信支付(一)详解编程语言
- 版本Linux上的微信开发之旅(微信开发工具linux)
- 微信免费清粉软件靠什么赚钱?原来是窃取用户微信群二维码卖给犯罪团伙
- 九宫格变十宫格 微信支付页上线腾讯惠聚入口
- 微信偷看聊天记录?看完这篇你就不怕了
- 微信来红Redis实现即时消息推送(微信发消息redis)
- android类似微信的摇一摇功能实现思路及代码
- ASP微信公共平台接口实现代码
- PHP限制页面只能在微信自带浏览器访问的代码