// class VoiceVolumeThread extends Thread{ private AudioRecord maudiorecord; private int bs; private int SAMPLE_RATE_IN_HZ = 8000; private boolean isRun = false; public VoiceVolumeThread() { super(); bs = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); maudiorecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bs); } @Override public void run() { super.run(); maudiorecord .startRecording(); // 用於讀取的buffer byte[] buffer = new byte[bs]; isRun = true; while (isRun) { int r = maudiorecord.read(buffer, 0, bs); int v = 0; // 將 buffer 內容取出,進行平方和運算 for (int i = 0; i < buffer.length; i++) { // 這裏沒有做運算的優化,爲了更加清晰的展示代碼 v += buffer[i] * buffer[i]; } // 平方和除以數據總長度,得到音量大小。可以獲取白噪聲值,然後對實際採樣進行標準化。 // 如果想利用這個數值進行操作,建議用 sendMessage 將其拋出,在 Handler 裏進行處理。 Log.d(TAG, String.valueOf(v / (float) r)); double dB = 10*Math.log10(v/(double)r); Log.d(TAG,"分貝:"+dB); } maudiorecord.stop(); } public void pause() { // 在調用本線程的 Activity 的 onPause 裏調用,以便 Activity 暫停時釋放麥克風 isRun = false; } public void start() { // 在調用本線程的 Activity 的 onResume 裏調用,以便 Activity 恢復後繼續獲取麥克風輸入音量 if (!isRun) { super.start(); } } }
android 錄音獲取相關值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.