Page({ data: { recordingSrc: '', isRecording: false, }, onLoad() { this.recorderManager = wx.getRecorderManager(); this.recorderManager.onStart(() => { console.log('recorder start'); this.setData({ isRecording: true }); this.startWaveformDrawing(); }); this.recorderManager.onStop((res) => { console.log('recorder stop', res); const { tempFilePath } = res; this.setData({ recordingSrc: tempFilePath, isRecording: false }); this.stopWaveformDrawing(); }); this.recorderManager.onError((res) => { console.error(res); this.setData({ isRecording: false }); this.stopWaveformDrawing(); }); }, startRecording() { if (this.data.isRecording) return; wx.authorize({ scope: 'scope.record', success: () => { const options = { duration: 60000, sampleRate: 44100, numberOfChannels: 1, encodeBitRate: 192000, format: 'aac', frameSize: 50 }; this.recorderManager.start(options); }, fail: () => { wx.showModal({ title: '授权失败', content: '请授权录音功能', showCancel: false }); } }); }, stopRecording() { if (!this.data.isRecording) return; this.recorderManager.stop(); }, startWaveformDrawing() { if (this.waveformInterval) return; const canvasContext = wx.createCanvasContext('waveform'); const drawWaveform = () => { if (!this.data.isRecording) return; // 生成模拟的音量数据 const data = new Array(100).fill(0).map(() => Math.random() * 100); canvasContext.clearRect(0, 0, 300, 100); canvasContext.beginPath(); canvasContext.moveTo(0, 50); for (let i = 0; i < data.length; i++) { const x = (i / data.length) * 300; const y = 50 - data[i] / 2; canvasContext.lineTo(x, y); } canvasContext.lineTo(300, 50); canvasContext.stroke(); canvasContext.draw(); this.waveformInterval = setTimeout(drawWaveform, 100); }; drawWaveform(); }, stopWaveformDrawing() { clearTimeout(this.waveformInterval); this.waveformInterval = null; } });