获取麦克风音量

来源:互联网 发布:网络电视和数字电视 编辑:程序博客网 时间:2024/04/27 15:00
public class AudioRecorder
{


    static final int FREQUENCY = 8000;


    static final int CHANNEL_CONFIGURATION = AudioFormat.CHANNEL_CONFIGURATION_MONO;


    static final int AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;


    int audioBufferSize;


    public static final int AUDIO_BUF_SIZE = 11;


    int recBufSize;


    AudioRecord audioRecord;


    Thread recordorThread;


    volatile boolean isRecording;    //可用于暂停


    private Handler handler;
    
    Thread encodeThread;
    
   // private Speex speex = new Speex();


    public AudioRecorder(Handler handler)
    {
        this.handler = handler;
        audioBufferSize = AudioRecord.getMinBufferSize(FREQUENCY, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);


        recBufSize = AudioRecord.getMinBufferSize(FREQUENCY, CHANNEL_CONFIGURATION, AUDIO_ENCODING);


        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, FREQUENCY, CHANNEL_CONFIGURATION, AUDIO_ENCODING, recBufSize);
        
    }


    public void startRecord()
    {
        if(!isRecording)
        {
            isRecording = true;
            audioRecord.startRecording();
            recordorThread = new RecordorThread();
            recordorThread.start();
        }


    }


    public void stopRecord()
    {
        isRecording = false;
        audioRecord.stop();
    }


    public boolean isRecording()
    {
        return isRecording;
    }


    //用于暂停
    public void setRecording(boolean isRecording)
    {
        this.isRecording = isRecording;
    }


    class RecordorThread extends Thread
    {
        public void run()
        {


            // 用于读取的 buffer
            byte[] tempBuffer = new byte[audioBufferSize];
            int bufferReadResult = 0;
            int count = 0;
            while (isRecording)
            {
                bufferReadResult = audioRecord.read(tempBuffer, 0, audioBufferSize);


                int v = 0;
                // 将 buffer 内容取出,进行平方和运算
                for (int i = 0; i < tempBuffer.length; i++)
                {
                 // 这里没有做运算的优化,为了更加清晰的展示代码
                    v += tempBuffer[i] * tempBuffer[i];
                }
                // 平方和除以数据总长度,得到音量大小。可以获取白噪声值,然后对实际采样进行标准化。
                // 如果想利用这个数值进行操作,建议用 sendMessage 将其抛出,在 Handler 里进行处理。
                //振幅
                Log.d("gc", " ******************  volume = "+String.valueOf(v / (float) bufferReadResult));
                //分贝(好像有问题)
                double dB = 10*Math.log10(v/(double)bufferReadResult);
                Log.d("gc", " ------------------  dB = " + dB);
                
                count++;
                if (bufferReadResult > 0 && count > 5)
                {
                    int ss = v / bufferReadResult*2;
                    Message msg = handler.obtainMessage();
                    msg.what = AUDIO_BUF_SIZE;
                    msg.arg1 = ss;
                    handler.sendMessage(msg);
                    count = 0;
                }
//                byte[] packagebyte = new byte[bufferReadResult];
//                System.arraycopy(tempBuffer, 0, packagebyte, 0, bufferReadResult);
            }
        }
    }
}
原创粉丝点击