android吹裙子的實現代碼

今天給大傢帶來安卓中的遊戲,吹裙子的核心實現代碼,如下:

 

package com.xxiyy.spl;

 

import android.media.AudioFormat;

import android.media.AudioRecord;

import android.media.MediaRecorder;

import android.util.Log;

 

public class RecordThread extends Thread {

    private AudioRecord ar;

    private int bs;

    private static 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();

                // 用於讀取的 buffer

        byte[] buffer = new byte[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];

            }

            // 平方和除以數據總長度,得到音量大小。可以獲取白噪聲值,然後對實際采樣進行標準化。

            // 如果想利用這個數值進行操作,建議用 sendMessage 將其拋出,在 Handler 裡進行處理。

            Log.d("spl", String.valueOf(v / (float) r));

        }

        ar.stop();

    }

 

    public void pause() {

                // 在調用本線程的 Activity 的 onPause 裡調用,以便 Activity 暫停時釋放麥克風

        isRun = false;

    }

 

    public void start() {

                // 在調用本線程的 Activity 的 onResume 裡調用,以便 Activity 恢復後繼續獲取麥克風輸入音量

        if (!isRun) {

            super.start();

        }

    }

}

 

 

 

 

原文中提到“平方和除以數據總長度,得到音量大小”,有些文章中提到這個音量值在不同的手機中表現得不一樣,同樣的發聲,但出來的值相差很大。進而有通過一些計算,調整“音量”的算法,其中有兩個,分別是:

 

 

1、計算瞭噪音,對音量進行調整: www.aiwalls.com

value 的 值 控制 為 0 到 100 之間 0為最小 》= 100為最大!!

 int value = (int) (Math.abs((int)(v /(float)r)/10000) >> 1);

 

 

 

 

2、計算分貝值:

 

 

那個值應該是聲音的振幅,並不是音量的大小,

聲音的大小應該是用分貝為單位的吧,

double dB = 10*Math.log10(v/(double)r);

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *