Java 我想在连续噪音响起时激活传感器(Android Studio)
我正在学习编程,事实是我没有太多的想法。我正在编程一个由音频传感器组成的应用程序,当听到房子里有噪音时,它就会被激活。我现在有这个代码 活动检测器噪声Java 我想在连续噪音响起时激活传感器(Android Studio),java,android,android-layout,android-fragments,Java,Android,Android Layout,Android Fragments,我正在学习编程,事实是我没有太多的想法。我正在编程一个由音频传感器组成的应用程序,当听到房子里有噪音时,它就会被激活。我现在有这个代码 活动检测器噪声 public class DetectNoise { // This file is used to record voice static final private double EMA_FILTER = 0.6; private MediaRecorder mRecorder = null; private
public class DetectNoise {
// This file is used to record voice
static final private double EMA_FILTER = 0.6;
private MediaRecorder mRecorder = null;
private double mEMA = 0.0;
public void start() {
if (mRecorder == null) {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
try {
mRecorder.prepare();
mRecorder.start();
mEMA = 0.0;
} catch (IllegalStateException e) {
Log.e("Error",e.toString());
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("Error",e.toString());
e.printStackTrace();
}
}
}
public double getAmplitude() {
if (mRecorder != null)
//return (mRecorder.getMaxAmplitude()/1100.0);
return 20 * Math.log10(mRecorder.getMaxAmplitude() / 2000);
else
return 0;
}
public double getAmplitudeEMA() {
double amp = getAmplitude();
mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
return mEMA;
}
活动一
private int mThreshold;
private static final int POLL_INTERVAL = 300;
mSensor = new DetectNoise();
private Handler mHandler = new Handler();
private Runnable mPollTask = new Runnable() {
public void run() {
double amp = mSensor.getAmplitude();
//Log.i("Noise", "runnable mPollTask");
updateDisplay("Monitoring Voice...", amp);
if ((amp > mThreshold)) {
callForHelp(amp);
//Log.i("Noise", "==== onCreate ===");
}// Runnable(mPollTask) will again execute after POLL_INTERVAL
mHandler.postDelayed(mPollTask, POLL_INTERVAL); }
问题是任何声音都会激活它。我希望它只在声音持续约5或7秒时激活
有人能帮我吗?
非常感谢您所做的一切开始初始时间戳为空,您可以从第一个振幅开始记录时间戳,如果它们在检测过程中消失,您可以将时间戳重置为空,如果声音持续存在,则将保留第一个录制的时间戳。您只需确定时间戳,然后通过减法判断声音持续时间即可获得时间戳记录
/**
*对不起,我的英语很差
*/
导入java.util.Random;
公共类测试实现可运行{
//你可以试着开始
公共静态void main(字符串[]args){
新线程(新测试()).start();
}
私有静态Long lastTime=null;
@凌驾
公开募捐{
//这是一个循环监视器,用于监视记录音量
while(true){
char temp=getAmplium();
System.out.print(temp);//测试输出
试一试{
//首次检测到声音
如果(lastTime==null&&temp!=''''
lastTime=System.currentTimeMillis();
//检测到停止的声音
如果(温度=“”“”)
lastTime=null;
//声音不断传来
//判断时间间隔
if(lastTime!=null&&System.currentTimeMillis()-lastTime>=2*1000){
//说两秒钟以上
System.out.println(“--|>发言超过两秒”);
lastTime=null;
}
//采样率为100毫秒
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
//--------------------------------------------------------------
//模拟记录音量
私有静态字符getAmplium(){
//如果有声音输出“A”,则没有声音输出“\
//您可以通过声级确定是否有声音
//这是一个例子
if(new Random().nextInt(100)感谢您这么快的回复,但我不明白您的答案,我编程时间很短,而且我是一个糟糕的程序员。举例来说,它更容易理解。请在一个答案中发布所有内容。不要对同一个问题多次给出答案。