您好,欢迎访问一九零五行业门户网

实现类似微信中说话功能的录音处理代码实例

package com.example.testaudio; import java.io.file; import android.app.activity; import android.media.mediaplayer; import android.media.mediaplayer.oncompletionlistener; import android.media.mediarecorder; import android.os.bundle; import android.os.environment; import android.os.handler; import android.os.message; import android.util.log; import android.view.menu; import android.view.motionevent; import android.view.view; import android.view.view.onclicklistener; import android.view.view.ontouchlistener; import android.widget.button; import android.widget.textview; public class mainactivity extends activity { private mediarecorder recoder = null; private mediaplayer player = null; private string themediapath; textview tv = null; textview tvrecord = null; button testbtn = null; button testbtn2 = null; button stopbtn = null; button playbtn = null; @override protected void oncreate(bundle savedinstancestate) { 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(new ontouchlistener() { @override public boolean ontouch(view v, motionevent event) { log.i("testactivity", "setontouchlistener:"+event.getaction()); switch(event.getaction()) { case motionevent.action_up: { log.i("testactivity", "停止录音"); stoprecording(); break; } case motionevent.action_down: { log.i("testactivity", "开始录音"); startrecording(); break; } default: break; } return false; } }); testbtn.setonclicklistener(new onclicklistener() { public void onclick(view arg0) { startrecording(); testbtn.setenabled(false); stopbtn.setenabled(true); } }); stopbtn.setenabled(false); stopbtn.setonclicklistener(new onclicklistener() { public void onclick(view arg0) { stoprecording(); testbtn.setenabled(true); playbtn.setenabled(true); stopbtn.setenabled(false); } }); playbtn.setonclicklistener(new onclicklistener() { public void onclick(view arg0) { playrecordfile(themediapath); stopbtn.setenabled(true); } }); } protected void playrecordfile(string _file) { try { file f = new file(_file); if(!f.exists()) { tv.settext("文件不存在:" + _file); return; } } catch(exception e) { log.i("testactivity", e.getmessage()); } try { player = new mediaplayer(); player.setdatasource(_file); player.prepare(); player.setoncompletionlistener(new oncompletionlistener() { public void oncompletion(mediaplayer arg0) { tv.settext("播放完毕"); stopbtn.setenabled(false); } }); player.start(); } catch(exception e) { log.e("testactivity", "play failed:" + e.getmessage()); } } /** * 停止录音处理 */ protected void stoprecording() { 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; } } /** * 开始录音处理 */ protected void startrecording() { themediapath = environment.getexternalstoragedirectory().getabsolutepath(); themediapath += "/audiotest.3gp"; recoder = new mediarecorder(); 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 (exception e) { log.e("testactivity", "prepared failed:" + e.getmessage()); _handlerecordstarterror(e); } } //定时器 private static long maxtime = 30*1000; //30秒 private long starttime = 0l; private long endtime = 0l; private final handler mhandler = new handler(); private runnable mupdatemicstatustimer = new runnable() { public void run() { //判断是否超时 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());前提时不对麦克风说任何话 */ private int base = 600; private int space = 300;// 间隔取样时间 private void updatemicstatus() { if (recoder != null) { // int vusize = 10 * mmediarecorder.getmaxamplitude() / 32768; int ratio = recoder.getmaxamplitude() / base; int db = 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); } else log.i("mic_", "麦克风的音量的大小:" + 0); */ } } private void _handlerecordstart() { //开始录音的接收函数 tv.settext("开始录音..."); //starttime 开始时间 } private void _handlerecordstarterror(exception e) { //开始录音的接收函数失败 tv.settext("开始录音失败:" + e.getmessage()); } private void _handlerecordcomplete() { //结束录音 tv.settext("停止录音:" + themediapath); } private void _handlerecordvoice(int _db) { //声音事件侦听,转换成分贝 tvrecord.settext(""+_db); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); return true; } }
以上就是实现类似微信中说话功能的录音处理代码实例的详细内容。
其它类似信息

推荐信息