java获取音量(分贝)的接口

该代码段展示了如何利用Android的AudioRecord类来实时监测环境噪声,并根据声音分贝值控制Bird类对象的flappy方法。通过设置采样率、缓冲区大小等参数初始化AudioRecord,读取麦克风数据并计算分贝值,当音量低于阈值时鸟儿不飞行,反之则按比例调整飞行高度。
摘要由CSDN通过智能技术生成
package xiaomeng.com.xsngame;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;

public class AudioRecordDemo {
    private static final String TAG = "AudioRecord";

    static final int SAMPLE_RATE_IN_HZ = 8000;

    static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);

    AudioRecord mAudioRecord;

    boolean isGetVoiceRun;

    Object mLock;
    Bird bird;

    public AudioRecordDemo(Bird bird) {
        this.bird=bird;
        mLock = new Object();
    }

    public void getNoiseLevel() {
        if (isGetVoiceRun) {
            Log.e(TAG, "还在录音中...");
            return;
        }

        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                SAMPLE_RATE_IN_HZ, AudioFormat.CHANNEL_IN_DEFAULT,
                AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);

        if (mAudioRecord == null) {
            Log.e("sound", "mAudioRecord初始化失败");
        }

        isGetVoiceRun = true;

        new Thread(new Runnable() {
            @Override

            public void run() {
                mAudioRecord.startRecording();//开始读取声音

                short[] buffer = new short[BUFFER_SIZE];

                while (isGetVoiceRun) {
//r是实际读取的数据长度,一般而言r会小于buffersize
                    int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE);
                    long v = 0;

// 将 buffer 内容取出,进行平方和运算

                    for (int i = 0; i < buffer.length; i++) {
                        v += buffer[i] * buffer[i];
                    }

// 平方和除以数据总长度,得到音量大小。

                    double mean = v / (double) r;

                    double volume = 10 * Math.log10(mean);//rms和分贝的转化
                    if(volume<50)
                    bird.flappy(0);
                    else
                        bird.flappy(volume/3.0);
                    Log.d(TAG, "分贝值:" + volume);

// 大概一秒十次

                    synchronized (mLock) {
                        try {
                            mLock.wait(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                }

                mAudioRecord.stop();

                mAudioRecord.release();

                mAudioRecord = null;

            }

        }).start();

    }
}

在其他地方的调用。

    double volume =audioRecordDemo.getNoiseLevel();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值