Android-使用mediarecorder类获取当前麦克风音量值
[原]Android-使用mediarecorder类获取当前麦克风音量值
2015-1-2阅读160评论0
获取当前麦克风音量
2014年12月22日
0:21
首先是界面:
检测麦克风当前音lenmon 量主要是用Android自己的类MediaRecorder
来实现的,很多函数都是可以直接使用的,所以实现检测麦克风音量
其实不是很难,只要注意一下使用的方法就可以了。
start:是开始监测
end:结束检测
大概思路就是用麦克风录音,用
Amplitude()函数来获取麦克风当前的音
量值
getMaxAmplitude()返回值就是从上一次调用
getMaxAmplitude()的时刻到这一次调用getMaxAmplitude()时
刻之间的音频振幅绝对值的最大值,如果控制两个getMaxAmplitude
()调用的间隔比较小的话,就可以实时得到当前的音频的振幅的绝
对值了。
值得一说的是,getMaxAmplitude()方法不能在android的主
线程循环调用,否则程序会闪退(哈,试过好几次了,都不知道是什
么原因,后来才发现是大概因为Android的主线程会使用比较多的资
源来调用这个方法,然后系统九崩溃了,就造成了闪退。解决的方法
就是把getMaxAmplitude()函数的调用放在一个线程里,通过控制
线程的启动时间间隔来减少使用的资源以保证程序稳定不会闪退)
以下是里的代码:(含注释)
;
;
ption;
;
ask;
BarActivity;
ssLint;
ecorder;
;
nment;
r;
e;
;
em;
;
ew;
;
@SuppressLint("ShowToas肌酐高的原因 t")
publicclassMainActivityextendsActionBarActivity{
privateMediaRecordermp;
privateTextViewtxt1;
privateintvalue=0;
privateTimerTasktask=null;
privateTimertimer=null;
privateintmaxx=0;
privateTextViewmaxtext;
FilesoundFile=null;
@Override
pro古代治水名人 tectedvoidonC电脑显示器分辨率 reate(BundlesavedInstanceState){
te(savedInstanceState);
tContentView(ty_main);
txt1=(TextView)findViewById();
maxtext=(TextView)findViewById(lue);
}
publicvoiddeal_with(Viewv){//这是按钮按下去
触发的函数,然后再执行对于的实现方法
switch(()){
t://开始按钮
startrec();
break;
://结束按钮
endrec();
break;
}
}
privatevoid
startrec(){//
开始监测,先准备好用麦克风录音,
if(mp==null){
Filedir=new
File(ernalStorageDirectory(),"sound");//指
定录音输出文件的文件夹(最后会删除录音文件的)
if(!()){
//文件夹路径不存在就创建一个
();
}
soundFile=newFile(dir,tTimeMillis()+".amr");
//创建输出文件
if(!()){
try{
NewFile();
}catch(IOExce脑缺氧 ptione){
//TODOAuto-generatedcatchblock
tackTrace();
}
}
mp=newMediaRecorder();
//程序中操作的MediaRecorder类
ioSource();
//MediaRecorder类的初始化(注意顺序不能反
putFormat(_W
B);
ioEncoder(_W
B);
putFile(olutePath());
//MediaRecorder和文件绑定,MediaRecorder录制的内容将自动保
存在soundFile文件中
try{
e();
();//
开始录音
}catch(IllegalStateExceptione){
//TODOAuto-generatedcatchblock
tackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
tackTrace();
}
xt(,"开始录音...",
_LONG).show();//标签提示一下
starttorec();
//调用线程来实现获取当前音频振幅(starttorecord)
}
}
privateHandlermHandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
t(""+1);//
把Handle中获得的信息在主线程使用,更新txt1的显示内容
if(maxx<1){//
(注意在tText()中要加"",否正月剪头发有什么说法 则又会跪(使用是跪了几次才发现
==)
maxx=1;//
显示最大值
t(""+maxx);
}
starttorec();//
重新调用检测的线程
}
};
publicvo杂菜煲 idstarttorec(){
timer=newTimer();
task=new
TimerTask(){//
设置线程抽象类中的run(),这里更新value的值
@Override
//把value的值放到用于线程之间交流数据的Handler的message里
publicvoidrun(){
value=Amplitude();
Messagemessage=Message();
1=value;
ssage(message);
//Handler类发出信息
}
};
le(task,100);
//timer,设置为100毫秒后执行task线程(会自动调用task的start
()函数)
//timer是计时器,作用就是在设定时间后启动规定的线程。这用
来限制
//getMaxAmplitude()的调用频率,减少资源的使用(时间调
太短,也会闪退)//
}
privatevoidendrec(){
if(mp!=null){
xt(,"录音结束...",
_SHORT).show();//提示
();;
//取消计时器(线程将不会被启动)
();
//停止录音
e();
//释放资源(mp不再绑定soundFile文件)
();
//删除刚才录下的文件节约空间(也可以不删拿出来听一听~)
mp=null;
//习惯性赋空值
}
}
}
文件就是这样,在中声
明写入sd卡,和打开麦克风的权限
还有的是同时刻,同场合不同机器所测出来的音频最大振幅值相
差比较大,应该是硬件个体性差异的缘故。
本文发布于:2023-03-17 06:59:09,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/a9d47e2403fef5d65d0d51e885f7f474.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:麦克风检测.doc
本文 PDF 下载地址:麦克风检测.pdf
留言与评论(共有 0 条评论) |