开发者社区> 问答> 正文

我想在持续发出噪音时激活传感器(Android Studio)

我正在学习编程,但事实是我没有太多想法。我正在编写一个由音频传感器组成的应用程序,当在房屋中听到噪音时,它就会被激活。我目前有此代码。

活动检测噪声

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秒时才激活它。

有谁能够帮助我?非常感谢你的一切

问题来源:Stack Overflow

展开
收起
montos 2020-03-23 10:28:16 903 0
1 条回答
写回答
取消 提交回答
  • start init时间戳为空,您可以从第一个振幅获取记录的时间戳,如果声音在检测过程中消失,则可以将时间戳重置为空,如果声音持续存在,则将保留第一个记录的时间戳您只需要确定时间戳和时间戳记录即可获得减法判断声音持续时间

    回答来源:Stack Overflow

    2020-03-23 10:28:43
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载