1.代码
<template>
<div class="subGuide">
<canvas id="canvas"></canvas>
<br>
<audio id="audio" src="./audio.mp3" controls></audio>
</div>
</template>
<script>
export default {
name: 'subGuide',
data() {
return {
}
},
mounted() {
const audioEle = document.querySelector('audio')
const cvs = document.querySelector('canvas')
const ctx = cvs.getContext('2d')
function initCvs() {
cvs.width = (window.innerWidth / 2) * devicePixelRatio
cvs.height = (window.innerHeight / 3) * devicePixelRatio
}
initCvs()
let isInit = false
let dateArray = null
let analyser = null
audioEle.addEventListener('play', function (e) {
if (isInit) return
const audCtx = new AudioContext()
const source = audCtx.createMediaElementSource(audioEle)
analyser = audCtx.createAnalyser()
analyser.fftSize = 512
dateArray = new Uint8Array(256)
source.connect(analyser)
analyser.connect(audCtx.destination)
isInit = true
})
function draw() {
requestAnimationFrame(draw)
const { width, height } = cvs
ctx.clearRect(0, 0, width, height)
if (!isInit) return
analyser.getByteFrequencyData(dateArray)
const len = dateArray.length / 2.5
ctx.fillStyle = '#266fff'
const barWidth = width / len / 2
for (let i = 0; i < len; i++) {
const data = dateArray[i]
const barHeight = (data / 255) * height
const x1 = i * barWidth + width / 2
const x2 = width / 2 - (i + 1) * barWidth
const y = height - barHeight
ctx.fillRect(x1, y, barWidth - 2, barHeight)
ctx.fillRect(x2, y, barWidth - 2, barHeight)
}
}
draw()
},
methods: {
}
}
</script>
<style lang="scss" scoped></style>
2.效果
音频可视化