如何实现类似微信中说话功能的录音处理

这篇文章给大家分享的是有关如何实现类似微信中说话功能的录音处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

代码如下:

如何实现类似微信中说话功能的录音处理

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;
}

}

感谢各位的阅读!关于“如何实现类似微信中说话功能的录音处理”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

发布于 2021-03-13 15:37:48
收藏
分享
海报
0 条评论
164
上一篇:PC端用.NET微信开发实现扫码注册和登录功能的示例 下一篇:微信公众号开发实现点击返回按钮就返回到聊天界面的方法
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码