如何实现类似微信中说话功能的录音处理
作者
这篇文章给大家分享的是有关如何实现类似微信中说话功能的录音处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
代码如下:
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; } }
感谢各位的阅读!关于“如何实现类似微信中说话功能的录音处理”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
目录
推荐阅读
-
EasyWechat如何开发微信公众号自动回复
-
微信开发怎样直接访问本地调试
微信开发怎样直接访问本地调试这篇文章主要为大家分析了微信开发怎样直...
-
微信开发中的自定菜单该如何创建
微信开发中的自定菜单该如何创建这篇文章主要为大家分析了微信开发中的...
-
如何实现微信打开网址添加在浏览器中打开提示
-
微信被限制登录的原因有哪些
-
微信中文件撤回时间延长了多久
-
微信提示登录环境异常的原因有哪些
这篇文章主要介绍微信提示登录环境异常的原因有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信提示登录...
-
微信开发之用户与姓名不匹配指的是什么意思
这篇文章给大家分享的是有关微信开发之用户与姓名不匹配指的是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过...
-
微信聊天中拍了拍指的是什么意思
-
微信莫名退出登录原因有哪些
小编给大家分享一下微信莫名退出登录原因有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!微信莫名退出登录原因:...
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~