簡體   English   中英

在Android中獲取麥克風的聲音級別(分貝級別)

[英]Get the Microphone sound level ( Decibel level) in Android

我對android很陌生,我已經搜索了好一陣子。 我想構建一個類似於分貝計的應用程序。 它實時顯示聲音水平。 房間里有很多噪音,會有聲音指示,如果安靜,會有聲音指示!

我完全不知道該怎么做。 誰能解釋一下麥克風聲音級應用程序的基礎知識? 如果可能的話,也許提供一些代碼?

謝謝!

您可以使用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); } }; 

對於Java,此問題已得到普遍解決,並且所需的類在Android中可用。

基本思想是對麥克風的數據線進行采樣,然后從返回的緩沖區中計算電平。

如何在Java中計算音頻信號的電平/幅度/ db?

您還可以查看執行FFT頻率分析的Visualizer類,但是麥克風的權限在各種設備上可能不一致。 您可能還必須將其連接到Equalizer類才能訪問麥克風。

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

市場上有一個很棒的應用程序叫做Audalyzer

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

還要檢查此討論。

Android:未錄制麥克風的示例可獲取實時振幅/電平?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM