前言
因为uni-app
和HTML5+
没有获取录音分贝的功能,无奈只能记录一下使用NativeJS
实现
代码实现
(1)初始化
data() {
return {
interval:null,
MediaRecorder:null,
filePath:"",
radio:null
}
}
(2)导入MediaRecorder类
var recorder = plus.android.importClass("android.media.MediaRecorder");
(3)录音对象的设置
// 文件保存路径(使用uni-app的默认保存路径,可以配合uni-app的API使用)
this.filePath = plus.io.convertLocalFileSystemURL("_doc")+'/uniapp_save/'+Date.now()+".mp3";
// 创建录音媒体对象
var MediaRecorder = new recorder();
// 设置音频源
MediaRecorder.setAudioSource(recorder.AudioSource.DEFAULT);
// 设置输出编码
MediaRecorder.setOutputFormat(recorder.OutputFormat.DEFAULT);
// 设置编码格式
MediaRecorder.setAudioEncoder(recorder.AudioEncoder.DEFAULT);
// 设置输出路径
MediaRecorder.setOutputFile(this.filePath);
(4)录音准备
MediaRecorder.prepare();
(5)开始录制
MediaRecorder.start();
this.MediaRecorder = MediaRecorder;
(6)每100毫秒获取最大的振幅
this.interval = setInterval(()=>{
if(this.MediaRecorder){
var radio = this.MediaRecorder.getMaxAmplitude();
if(radio > 1){
radio = 20 * Math.log10(radio); // 计算分贝
}
this.radio = radio;
}
},100)
(7)结束录制
// 清除计时器
clearInterval(this.interval);
// 暂停录音
this.MediaRecorder.stop();
// 释放录音
this.MediaRecorder.release();
(8)播放录音
let player = plus.audio.createPlayer({ src:this.filePath });
player.play(/*success:callback,fail:callback*/);
(9)获取文件列表
let _this = this;
uni.getSavedFileList({
success({fileList}) {
// 文件筛选
fileList = fileList.filter(e=>{
let filePath = e.filePath;
return /\.mp3$/i.test(filePath);
})
_this.fileList = fileList;
}
})
210811补充代码
注:分贝获取不知道准不准确
<template>
<view class="content">
<div>录音权限:{{ permission }}</div>
分贝:{{ radio }}
<button type="default" @click="start">开始录制</button>
<button type="default" @click="stop">结束录制</button>
</view>
</template>
<script>
export default {
data() {
return {
interval: null,
MediaRecorder: null,
filePath: '',
radio: 0,
fileList: [],
code: null
};
},
computed: {
permission() {
return ({
"-1": '永久拒绝',
"0": '临时拒绝',
"1": '允许'
})[this.code]
}
},
onLoad() {
this.initPermissions();
},
methods: {
async initPermissions() {
plus.android.requestPermissions(['android.permission.RECORD_AUDIO'], e => {
if (e.deniedAlways.length > 0) { //权限被永久拒绝
this.code = -1;
}
if (e.deniedPresent.length > 0) { //权限被临时拒绝
this.code = 0;
}
if (e.granted.length > 0) { //权限被允许
this.code = 1;
}
});
},
// 每100毫秒获取最大的振幅
getDecibel() {
this.interval = setInterval(() => {
if (this.MediaRecorder) {
let radio = this.MediaRecorder.getMaxAmplitude();
if (radio > 1) {
radio = 20 * Math.log10(radio); // 计算分贝
}
this.radio = radio;
}
}, 100);
},
start() {
if (this.code !== 1) return this.initPermissions();
if (this.MediaRecorder) {
this.MediaRecorder.release();
this.MediaRecorder = null;
}
var recorder = plus.android.importClass('android.media.MediaRecorder');
// 创建录音媒体对象
var MediaRecorder = new recorder();
// 设置音频源
MediaRecorder.setAudioSource(recorder.AudioSource.DEFAULT);
// 设置输出编码
MediaRecorder.setOutputFormat(recorder.OutputFormat.DEFAULT);
// 设置编码格式
MediaRecorder.setAudioEncoder(recorder.AudioEncoder.DEFAULT);
// 设置输出路径
let filePath = plus.io.convertLocalFileSystemURL('_doc') + Date.now() + '.mp3';
MediaRecorder.setOutputFile(filePath);
MediaRecorder.prepare();
MediaRecorder.start();
this.MediaRecorder = MediaRecorder;
this.getDecibel();
},
stop() {
// 清除计时器
clearInterval(this.interval);
// 暂停录音
this.MediaRecorder.stop();
// 释放录音
this.MediaRecorder.release();
this.MediaRecorder = null;
}
}
};
</script>
<style>
.content {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
</style>
开启APP权限
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>"
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>"