在 Android 中获取麦克风声级(分贝级)

Seb*_*Seb 5 java android

我对android很陌生,我已经搜索了很长一段时间。我想构建一个类似于分贝计的应用程序。它实时显示声级。如果房间里有很多噪音,就会有什么迹象表明,如果它安静,就会有什么迹象表明!。

我根本不知道如何做到这一点。谁能解释一下麦克风声级应用程序的基础知识?如果可能的话,也许提供一些代码?

谢谢!

Tun*_*ong 6

您可以使用MediaRecorder.getMaxAmplitude().

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO},
            RECORD_AUDIO);
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用 MediaRecorder 获取噪音水平,

    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();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mRecorder.start();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 启动媒体记录器,

    private Runnable mSleepTask = new Runnable() {
        public void run() {
            //Log.i("Noise", "runnable mSleepTask");
            mSensor.start();
            if (!mWakeLock.isHeld()) {
                 mWakeLock.acquire();
            }
            //Noise monitoring start
            // Runnable(mPollTask) will execute after POLL_INTERVAL
            mHandler.postDelayed(mPollTask, POLL_INTERVAL);
        }
    };
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建 Runnable Thread 以经常检查噪音水平,

    private Runnable mPollTask = new Runnable() {
        public void run() {
            double amp = mSensor.getAmplitude();
            //Log.i("Noise", "runnable mPollTask");
            // Runnable(mPollTask) will again execute after POLL_INTERVAL
            mHandler.postDelayed(mPollTask, POLL_INTERVAL);
        }
    };
    
    Run Code Online (Sandbox Code Playgroud)

使用以下公式将振幅转换为分贝,

return 20 * Math.log10(mRecorder.getMaxAmplitude() / 2700.0);
Run Code Online (Sandbox Code Playgroud)
  1. 监控声音和警报是否有更大的噪音。

    // Create runnable thread to Monitor Voice
    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);
        }
    };
    
    Run Code Online (Sandbox Code Playgroud)


tim*_*ror 0

市场上有一款很棒的应用程序,名为 Audalyzer

http://code.google.com/p/moonblink/wiki/Audalyzer

另请检查此讨论..

Android:无需录音即可获取实时幅度/电平的示例麦克风?

  • 这不是答案,这家伙显然是在问如何构建应用程序。他不是在寻找应用程序 (5认同)