赞
踩
- <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>
音频可视化
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。