android錄音和得到音量

來源:互聯網
上載者:User

class RecordThread extends Thread {
            private AudioRecord ar;
            private int bs;
            private final int SAMPLE_RATE_IN_HZ = 8000;
            private boolean isRun = false;
 
            public RecordThread() {
                    super();
                    bs = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
                                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                    AudioFormat.ENCODING_PCM_16BIT);
                    ar = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
                                    AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                    AudioFormat.ENCODING_PCM_16BIT, bs);
            }
             
            public void run() {
                    super.run();
                    ar.startRecording();
                    // 用於讀取的
                   short[]
buffer = new short[bs];
                    isRun = true;
                    while (isRun) {
                            int r = ar.read(buffer, 0, bs);
                            int v = 0;
                            // 將 buffer 內容取出,進行平方和運算
                            for (int i = 0; i < buffer.length; i++) {
                                    // 這裡沒有做運算的最佳化,為了更加清晰的展示代碼
                                    v += buffer<i> * buffer<i>;
                            }
                             
                            //value 的 值 控制 為 0 到 100 之間 0為最小 》= 100為最大!!
                            int value = (int) (Math.abs((int)(v /(float)r)/10000) >> 1);
                            Log.d("111", "v = " + v);
                            // 平方和除以資料總長度,得到音量大小。可以擷取白色雜訊值,然後對實際採樣進行標準化。
                            // 如果想利用這個數值進行操作,建議用 sendMessage 將其拋出,在 Handler 裡進行處理。
                            Log.d("222", String.valueOf(v / (float) r));
                             
                            double dB = 10*Math.log10(v/(double)r);
                            Log.d("333", "dB = " + dB);
                             
                            Message msg = new Message();
                            msg.what = 3;
                            msg.arg1 = value;
                            mHandler.sendMessage(msg);
                             
                    }
                    ar.stop();
            }
 
            public void pause() {
                    // 在調用本線程的 Activity 的 onPause 裡調用,以便 Activity 暫停時釋放麥克風
                    isRun = false;
            }
 
            public void start() {
                    // 在調用本線程的 Activity 的 onResume 裡調用,以便 Activity 恢複後繼續擷取麥克風輸入音量
                    if (!isRun) {
                            super.start();
                    }
            }
 
    }</i></i>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.