Audio 音频
一、基础用法
<template>
<div class="audio-demo">
<se-audio
:src="src"
:action="audioAction"
@play="audioPlayed"
@pause="audioPaused"
@timeupdate="audioTimeUpdated"
@error="getErrMsg"
controls
loop
></se-audio>
<div class="btn-groups">
<se-button @click="playAudio">播放</se-button>
<se-button @click="pauseAudio">暂停</se-button>
</div>
<h4>进度</h4>
<se-slider :value="0" @change="timeSliderChanged">
<template v-slot:suffix="scope">
<span style="position: absolute; right: -40px;">
{{ scope.value }}
</span>
</template>
</se-slider>
<h4>播放速率</h4>
<se-slider
:min="1"
:max="4"
:value="1"
:marks="marks"
@change="playbackRateSliderChanged"
show-marks
/>
</div>
</template>
<script>
export default {
data() {
return {
src: 'http://s3.qhres.com/static/1d7774ba4a6a3041.mp3',
audioAction: {
method: 'pause'
},
duration: 0,
marks: [1, 2, 3, 4]
}
},
methods: {
getErrMsg(e) {
console.log(e.detail)
},
audioPlayed() {
console.log('audio is played')
},
audioPaused() {
console.log('audio is paused')
},
audioTimeUpdated(e) {
this.duration = e.detail.duration
},
playAudio() {
this.audioAction = {
method: 'play'
}
},
pauseAudio() {
this.audioAction = {
method: 'pause'
}
},
timeSliderChanged(e) {
if (!this.duration) return
let time = (this.duration * e.detail.value) / 100
this.audioAction = {
method: 'setCurrentTime',
data: time
}
},
playbackRateSliderChanged(e) {
this.audioAction = {
method: 'setPlaybackRate',
data: e.detail.value
}
}
}
}
</script>
<style scoped>
.audio-demo {
width: 400px;
padding: 0 24px;
}
.btn-groups {
margin: 20px 0;
}
</style>
Props
属性 | 类型 | 默认值 | 必填 | 说明 |
---|
id | string | | 否 | audio 组件的唯一标识符 |
src | string | | 否 | 要播放音频的资源地址 |
loop | boolean | false | 否 | 是否循环播放 |
controls | boolean | false | 否 | 是否显示默认控件 |
name | string | 未知曲目 | 否 | 默认控件上的音频名字 |
author | string | 未知艺术家 | 否 | 默认控件上的作者名字 |
action | Object | | 否 | 执行内部方法,格式:{ method: string, data: value } ,method 可选值play、pause、setCurrentTime、setPlaybackRate |
Events
事件名称 | 描述 | 回调函数参数 |
---|
error | EventHandle | 当发生错误时触发 error 事件,detail = {errMsg:MediaError.code} |
play | EventHandle | 当开始/继续播放时触发 play 事件 |
pause | EventHandle | 当暂停播放时触发 pause 事件 |
timeupdate | EventHandle | 当播放进度改变时触发 timeupdate 事件,detail = {currentTime, duration} |
ended | EventHandle | 当播放到末尾时触发 ended 事件 |
MediaError.code
返回错误码 | 描述 |
---|
1 | 获取资源被用户禁止 |
2 | 网络错误 |
3 | 解码错误 |
4 | 不合适资源 |
二、AudioContext
创建 InnerAudioContext 实例。
<template>
<div class="audio-demo">
<div class="btn-groups">
<se-button @click="playAudio">播放</se-button>
<se-button @click="pauseAudio">暂停</se-button>
<se-button @click="stopAudio">停止</se-button>
</div>
<h4>手动调节进度</h4>
<se-slider @change="timeSliderChanged">
<template v-slot:suffix="scope">
<span style="position: absolute; right: -40px;">
{{ scope.value }}
</span>
</template>
</se-slider>
<h4>音量</h4>
<se-slider @change="volumeSliderChanged" :value="50">
<template v-slot:suffix="scope">
<span style="position: absolute; right: -40px;">
{{ scope.value }}
</span>
</template>
</se-slider>
<h4>进度条</h4>
<se-progress :percent="percent"></se-progress>
</div>
</template>
<script>
export default {
data() {
return {
audio: {},
duration: 0,
percent: 0
}
},
mounted() {
this.audio = this.$createInnerAudioContext()
this.audio.src = 'http://s3.qhres.com/static/1d7774ba4a6a3041.mp3'
this.audio.volume = 0.5
this.audio.onPlay(this.playHandler)
// this.audio.offPlay(this.playHandler)
this.audio.onPause(() => {
console.log('audio is paused')
})
this.audio.onTimeUpdate(() => {
if (!this.duration) return
this.percent = (this.audio.currentTime / this.duration) * 100
})
this.audio.onError(err => {
console.log(err)
})
},
methods: {
playHandler() {
this.duration = this.audio.duration
console.log('audio is played')
},
playAudio() {
this.audio.play()
},
pauseAudio() {
this.audio.pause()
},
stopAudio() {
this.audio.stop()
},
timeSliderChanged(e) {
if (!this.duration) return
let time = (this.duration * e.detail.value) / 100
this.audio.seek(time)
},
volumeSliderChanged(e) {
this.audio.volume = (e.detail.value / 100).toFixed(1)
}
},
beforeDestroy() {
this.audio.destroy()
}
}
</script>
<style scoped>
.audio-demo {
width: 400px;
padding: 0 24px;
}
.btn-groups {
margin: 20px 0;
}
.se-progress {
width: 400px;
}
</style>
AudioContext 属性
属性 | 类型 | 默认值 | 说明 |
---|
src | string | | 音频资源的地址,用于直接播放 |
startTime | number | 0 | 开始播放的位置(单位:s) |
loop | boolean | false | 是否循环播放 |
volume | number | 1 | 音量。范围 0~1。 |
duration | number | | 当前音频的长度(单位 s)。只有在当前有合法的 src 时返回(只读) |
currentTime | number | | 当前音频的播放位置(单位 s)。只有在当前有合法的 src 时返回,时间保留小数点后 6 位(只读) |
paused | boolean | | 当前是是否暂停或停止状态(只读) |
buffered | number | | 音频缓冲的时间点,仅保证当前播放时间点到此时间点内容已缓冲(只读) |
AudioContext 方法
事件名 | 说明 | 参数 |
---|
play | 播放 | |
pause | 暂停。暂停后的音频再播放会从暂停处开始播放 | |
stop | 停止。停止后的音频再播放会从头开始播放。 | |
seek | 跳转到指定位置 | number position |
destroy | 销毁当前实例 | |
onCanplay | 监听音频进入可以播放状态的事件。但不保证后面可以流畅播放 | function callback |
offCanplay | 取消监听音频进入可以播放状态的事件 | function callback |
onPlay | 监听音频播放事件 | function callback |
offPlay | 取消监听音频播放事件 | function callback |
onPause | 监听音频暂停事件 | function callback |
offPause | 取消监听音频暂停事件 | function callback |
onEnded | 监听音频自然播放至结束的事件 | function callback |
offEnded | 取消监听音频自然播放至结束的事件 | function callback |
onTimeUpdate | 监听音频播放进度更新事件 | function callback |
offTimeUpdate | 取消监听音频播放进度更新事件 | function callback |
onError | 监听音频播放错误事件 | function callback |
offError | 取消监听音频播放错误事件 | function callback |
onWaiting | 监听音频加载中事件。当音频因为数据不足,需要停下来加载时会触发 | function callback |
offWaiting | 取消监听音频加载中事件 | function callback |
onSeeking | 监听音频进行跳转操作的事件 | function callback |
offSeeking | 取消监听音频进行跳转操作的事件 | function callback |
onSeeked | 监听音频完成跳转操作的事件 | function callback |
offSeeked | 取消监听音频完成跳转操作的事件 | function callback |