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

时间:2011-08-25 22:05:42

标签: java android

我对Android很新,我已经搜索了很长一段时间了。我想构建一个类似分贝计的应用程序。实时显示声级。在房间里有很多噪音,会有一些东西表明,如果它安静的东西会表明!。

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

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用MediaRecorder.getMaxAmplitude()

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

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO},
            RECORD_AUDIO);
}
  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();
    
  2. 启动MediaRecorder,

    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);
        }
    };
    
  3. 创建可运行线程以经常检查噪声水平,

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

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

return 20 * Math.log10(mRecorder.getMaxAmplitude() / 2700.0);
  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);
        }
    };
    

答案 1 :(得分:0)

答案 2 :(得分:0)

此问题已针对Java进行了一般性解决,并且Android中提供了所需的类。

基本思想是为麦克风采样数据线,并从返回的缓冲区计算级别。

How to calculate the level/amplitude/db of audio signal in java?

您还可以查看进行FFT频率分析的Visualizer类,但麦克风的权限可能在各种设备上不一致。您可能还必须将其连接到Equalizer类才能访问麦克风。

https://developer.android.com/reference/android/media/audiofx/Visualizer.html