// #ifdef H5 import Recorder from '../lib/recorder.mp3.min.js'; // #endif export default class RecorderManager { recorder = null; //录音开始时间 uniStartTime = null; //语音录音中 recording = false; onRecordingComplete = null; constructor() { // #ifdef H5 this.recorder = Recorder({ type : 'mp3', sampleRate:16000,//录音的采样率,越大细节越丰富越细腻 bitRate:16,//录音的比特率,越大音质越好 onProcess : function () {} }); // #endif // #ifndef H5 this.recorder = uni.getRecorderManager(); // #endif } onRecordComplete(callBack) { this.onRecordingComplete = callBack; // #ifndef H5 this.initUniRecorder(); // #endif } initUniRecorder() { //录音结束后,发送 this.recorder.onStop((res) => { const duration = Date.now() - this.uniStartTime; res.duration = duration; this.onRecordingComplete(res, duration); }); } authorize() { return new Promise((resolve,reject) => { // #ifdef H5 this.recorder.open(() => { resolve(); }, (e) => { this.recorder.close(); reject(e); }); // #endif // #ifdef APP if (plus.os.name === "iOS") { var avaudiosession = plus.ios.import("AVAudioSession"); var avaudio = avaudiosession.sharedInstance(); var permissionStatus = avaudio.recordPermission(); if (permissionStatus === 1684369017 || permissionStatus === 1970168948) { console.log("麦克风权限没有开启"); } plus.ios.deleteObject(avaudiosession); resolve() } else { plus.android.requestPermissions( ['android.permission.RECORD_AUDIO'], (resultObj) => { resultObj.granted.length ? resolve() : reject("已拒绝"); }, (error) => { console.error(`申请权限错误:${error.code} = ${error.message}`); reject(); } ); } // #endif // #ifdef MP if (uni.authorize) { uni.authorize({ scope: 'scope.record', success() { resolve() }, fail: (e) => { reject(e) } }); } // #endif }); } start() { this.recording = true; // #ifdef H5 this.recorder.start(); // #endif // #ifndef H5 try { // 更多配置参考uniapp:https://uniapp.dcloud.net.cn/api/media/record-manager.html#getrecordermanager this.recorder.start({ duration: 600000 // 指定录音的时长,单位 ms }); this.uniStartTime = Date.now(); } catch (e) { console.log(e); } // #endif } stop() { this.recording = false; // #ifdef H5 this.recorder.stop((blob, duration) => { const file = new File([blob], 'audio.mp3', {type: blob.type}); file.tempFilePath = URL.createObjectURL(blob); file.duration = duration; this.onRecordingComplete(file, duration); }, (msg) => { console.log('录音失败:',msg) }) // #endif // #ifndef H5 try { this.recorder.stop(); } catch (e) { console.log(e); } // #endif } }