美文网首页
健康宝——呼吸频率部分开发(五)

健康宝——呼吸频率部分开发(五)

作者: garlic_666 | 来源:发表于2017-09-03 22:27 被阅读0次

    声音强度


    度量声音强度,就是分贝(decibel,缩写为dB)。这是一个无纲量的相对单位,计算公式如下:


    分子是测量值的声压,分母是参考值的声压(20微帕,人类所能听到的最小声压)。因此日常中说道声音强度是多少多少分贝时,都是默认了一个很小的参考值的。
    而Android设备传感器可以提供的物理量是场的幅值(amplitude),常用下列公式计算分贝值:

    从SDK中读取了某段音频数据的振幅后,取最大振幅或平均振幅(可以用平方和平均,或绝对值的和平均),代入上述公式的A1。

    声音检测类实现


    采用系统自带的MediaRecorder实现,用它的无参方法getMaxAmplitude即可获得一小段时间内音源数据中的最大振幅。
    代码为:

    public class BreathRecoder {
    public File myRecAudioFile;
    private MediaRecorder mMediaRecorder;
    public boolean isRecording = false;
    
    public float getMaxAmplitude() {
        if (mMediaRecorder != null) {
            try {
                return mMediaRecorder.getMaxAmplitude();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
                return 0;
            }
        } else {
            return 5;
        }
    }
    
    public File getMyRecAudioFile() {
        return myRecAudioFile;
    }
    
    public void setMyRecAudioFile(File myRecAudioFile) {
        this.myRecAudioFile = myRecAudioFile;
    }
    
    /**
     * 录音
     *
     * @return 是否成功开始录音
     */
    public boolean startRecorder() {
        if (myRecAudioFile == null) {
            return false;
        }
        try {
            mMediaRecorder = new MediaRecorder();
    
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mMediaRecorder.setOutputFile(myRecAudioFile.getAbsolutePath());
    
            mMediaRecorder.prepare();
            mMediaRecorder.start();
            isRecording = true;
            return true;
        } catch (IOException exception) {
            mMediaRecorder.reset();
            mMediaRecorder.release();
            mMediaRecorder = null;
            isRecording = false;
            exception.printStackTrace();
        } catch (IllegalStateException e) {
            stopRecording();
            e.printStackTrace();
            isRecording = false;
        }
        return false;
    }
    
    public void stopRecording() {
        if (mMediaRecorder != null) {
            if (isRecording) {
                try {
                    mMediaRecorder.stop();
                    mMediaRecorder.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            mMediaRecorder = null;
            isRecording = false;
        }
    }
    
    public void delete() {
        stopRecording();
        if (myRecAudioFile != null) {
            myRecAudioFile.delete();
            myRecAudioFile = null;
        }
    }
    }

    相关文章

      网友评论

          本文标题:健康宝——呼吸频率部分开发(五)

          本文链接:https://www.haomeiwen.com/subject/azxsjxtx.html