准备开发一个助眠app,途中要实现监听用户梦话这一功能,由于前台人员使用的h5+封装的audiorecorder对象不足以达到预期效果,所以决定采用native.js调用原生mediorecorder对象实现梦话监听功能。
代码主要逻辑是通过实时录音来检测声音分贝大小来分辨此段音频是否符合梦话的分贝大小,检测到有音频输入则保存文件到手机根目录,代码应该写在定时器中定时调用。
代码如下:
<script type="text/javascript">
//参数n为录音时间,单位毫秒
function sleep(n) {
var start = new Date().getTime();
// console.log('休眠前:' + start);
while (true) {
if (new Date().getTime() - start > n) {
break;
}
}
// console.log('休眠后:' + new Date().getTime());
}
var index = 0;//标识梦话文件,这个变量应该写在定时器之外,为了改变文件名,不然会造成文件覆盖
document.addEventListener('plusready', function(){
//console.log("所有plus api都应该在此事件发生后调用,否则会出现plus is undefined。"
var recorder = plus.ios.importClass("android.media.MediaRecorder");
var mrecorder = new recorder();
var File = plus.android.importClass("java.io.File");
var filePath = "/sdcard/dream"+ index++ +".mp3";
// 设置麦克风为音频源
mrecorder.setAudioSource(recorder.AudioSource.MIC);
// 设置音频文件的编码
mrecorder.setOutputFormat(recorder.OutputFormat.DEFAULT);
// 设置输出文件的格式
mrecorder.setAudioEncoder(recorder.AudioEncoder.DEFAULT);//可以设置成 MediaRecorder.AudioEncoder.AMR_NB
mrecorder.setOutputFile(filePath);
mrecorder.prepare();
mrecorder.start();
mrecorder.getMaxAmplitude();
sleep(5000);
if (mrecorder!=null) {
//mrecorder.stop();
//mrecorder.release();
}
var radio = mrecorder.getMaxAmplitude();//得到最大振幅
//获取最大音量
if (radio>1) {
radio = 20 * Math.log10(radio);
}
//分贝大于30 能被人耳听到,所以保存该段录音
if (radio>30&&mrecorder!=null) {
mrecorder.stop();
mrecorder.release();
}
if (radio<=30&&mrecorder!=null) {
console.log("reset");
mrecorder.stop();
mrecorder.release();
var file = new File(filePath);
if (file.exists()) {
file.delete();
console.log("分贝小,删除文件")
}
}
});
</script>
以上代码块能实现梦话监听的基本功能,注释很详细,逻辑也很简单,如果要用在真机测试上一定要注意权限模块的添加。
有任何问题以及不对希望大神指出,感谢!