声音强度
度量声音强度,就是分贝(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;
}
}
}