vue实现音频播放
Vue 实现音频播放的方法
使用 HTML5 <audio> 元素
在 Vue 模板中直接使用 <audio> 标签,通过 ref 绑定控制播放。
<template>
<div>
<audio ref="audioPlayer" :src="audioSrc"></audio>
<button @click="play">播放</button>
<button @click="pause">暂停</button>
</div>
</template>
<script>
export default {
data() {
return {
audioSrc: 'path/to/audio.mp3'
}
},
methods: {
play() {
this.$refs.audioPlayer.play()
},
pause() {
this.$refs.audioPlayer.pause()
}
}
}
</script>
使用第三方库(如 Howler.js)
Howler.js 提供更强大的音频控制功能,适合复杂场景。
npm install howler
<template>
<div>
<button @click="playSound">播放</button>
</div>
</template>
<script>
import { Howl } from 'howler'
export default {
methods: {
playSound() {
const sound = new Howl({
src: ['path/to/audio.mp3']
})
sound.play()
}
}
}
</script>
动态切换音频源
通过响应式数据绑定实现动态音频切换。
<template>
<div>
<audio ref="audioPlayer" :src="currentAudio"></audio>
<button @click="changeAudio('new-audio.mp3')">切换音频</button>
</div>
</template>
<script>
export default {
data() {
return {
currentAudio: 'default-audio.mp3'
}
},
methods: {
changeAudio(newAudio) {
this.currentAudio = newAudio
this.$nextTick(() => {
this.$refs.audioPlayer.play()
})
}
}
}
</script>
音频进度控制
监听 timeupdate 事件实现进度条功能。
<template>
<div>
<audio
ref="audioPlayer"
:src="audioSrc"
@timeupdate="updateProgress"
></audio>
<input
type="range"
v-model="progress"
@input="seek"
>
</div>
</template>
<script>
export default {
data() {
return {
audioSrc: 'path/to/audio.mp3',
progress: 0,
duration: 0
}
},
mounted() {
this.$refs.audioPlayer.addEventListener('loadedmetadata', () => {
this.duration = this.$refs.audioPlayer.duration
})
},
methods: {
updateProgress() {
this.progress = (this.$refs.audioPlayer.currentTime / this.duration) * 100
},
seek() {
this.$refs.audioPlayer.currentTime = (this.progress / 100) * this.duration
}
}
}
</script>
音频可视化
使用 Web Audio API 实现音频波形可视化。
<template>
<div>
<audio ref="audioPlayer" :src="audioSrc"></audio>
<canvas ref="canvas"></canvas>
</div>
</template>
<script>
export default {
data() {
return {
audioSrc: 'path/to/audio.mp3'
}
},
mounted() {
const audioContext = new (window.AudioContext || window.webkitAudioContext)()
const analyser = audioContext.createAnalyser()
const source = audioContext.createMediaElementSource(this.$refs.audioPlayer)
source.connect(analyser)
analyser.connect(audioContext.destination)
const canvas = this.$refs.canvas
const canvasCtx = canvas.getContext('2d')
function visualize() {
requestAnimationFrame(visualize)
const bufferLength = analyser.frequencyBinCount
const dataArray = new Uint8Array(bufferLength)
analyser.getByteTimeDomainData(dataArray)
canvasCtx.fillStyle = 'rgb(200, 200, 200)'
canvasCtx.fillRect(0, 0, canvas.width, canvas.height)
canvasCtx.lineWidth = 2
canvasCtx.strokeStyle = 'rgb(0, 0, 0)'
canvasCtx.beginPath()
const sliceWidth = canvas.width * 1.0 / bufferLength
let x = 0
for(let i = 0; i < bufferLength; i++) {
const v = dataArray[i] / 128.0
const y = v * canvas.height/2
if(i === 0) {
canvasCtx.moveTo(x, y)
} else {
canvasCtx.lineTo(x, y)
}
x += sliceWidth
}
canvasCtx.lineTo(canvas.width, canvas.height/2)
canvasCtx.stroke()
}
visualize()
}
}
</script>
移动端兼容处理
针对移动端自动播放限制,添加用户交互触发。
<template>
<div>
<audio ref="audioPlayer" :src="audioSrc"></audio>
<button @click="initAudio">点击初始化音频</button>
</div>
</template>
<script>
export default {
data() {
return {
audioSrc: 'path/to/audio.mp3',
audioInitialized: false
}
},
methods: {
initAudio() {
if (!this.audioInitialized) {
this.$refs.audioPlayer.load()
this.audioInitialized = true
}
this.$refs.audioPlayer.play()
}
}
}
</script>
以上方法覆盖了 Vue 中实现音频播放的常见场景,从基础播放控制到高级可视化功能。根据项目需求选择适合的实现方式,注意移动端浏览器的自动播放策略限制。







