android 錄音獲取相關值

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

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章