Audio 音频

一、基础用法

Audio 音频 - 图1

  1. <template>
  2. <div class="audio-demo">
  3. <se-audio
  4. :src="src"
  5. :action="audioAction"
  6. @play="audioPlayed"
  7. @pause="audioPaused"
  8. @timeupdate="audioTimeUpdated"
  9. @error="getErrMsg"
  10. controls
  11. loop
  12. ></se-audio>
  13. <div class="btn-groups">
  14. <se-button @click="playAudio">播放</se-button>
  15. <se-button @click="pauseAudio">暂停</se-button>
  16. </div>
  17. <h4>进度</h4>
  18. <se-slider :value="0" @change="timeSliderChanged">
  19. <template v-slot:suffix="scope">
  20. <span style="position: absolute; right: -40px;">
  21. {{ scope.value }}
  22. </span>
  23. </template>
  24. </se-slider>
  25. <h4>播放速率</h4>
  26. <se-slider
  27. :min="1"
  28. :max="4"
  29. :value="1"
  30. :marks="marks"
  31. @change="playbackRateSliderChanged"
  32. show-marks
  33. />
  34. </div>
  35. </template>
  36. <script>
  37. export default {
  38. data() {
  39. return {
  40. src: 'http://s3.qhres.com/static/1d7774ba4a6a3041.mp3',
  41. audioAction: {
  42. method: 'pause'
  43. },
  44. duration: 0,
  45. marks: [1, 2, 3, 4]
  46. }
  47. },
  48. methods: {
  49. getErrMsg(e) {
  50. console.log(e.detail)
  51. },
  52. audioPlayed() {
  53. console.log('audio is played')
  54. },
  55. audioPaused() {
  56. console.log('audio is paused')
  57. },
  58. audioTimeUpdated(e) {
  59. this.duration = e.detail.duration
  60. },
  61. playAudio() {
  62. this.audioAction = {
  63. method: 'play'
  64. }
  65. },
  66. pauseAudio() {
  67. this.audioAction = {
  68. method: 'pause'
  69. }
  70. },
  71. timeSliderChanged(e) {
  72. if (!this.duration) return
  73. let time = (this.duration * e.detail.value) / 100
  74. this.audioAction = {
  75. method: 'setCurrentTime',
  76. data: time
  77. }
  78. },
  79. playbackRateSliderChanged(e) {
  80. this.audioAction = {
  81. method: 'setPlaybackRate',
  82. data: e.detail.value
  83. }
  84. }
  85. }
  86. }
  87. </script>
  88. <style scoped>
  89. .audio-demo {
  90. width: 400px;
  91. padding: 0 24px;
  92. }
  93. .btn-groups {
  94. margin: 20px 0;
  95. }
  96. </style>

Props

属性类型默认值必填说明
idstringaudio 组件的唯一标识符
srcstring要播放音频的资源地址
loopbooleanfalse是否循环播放
controlsbooleanfalse是否显示默认控件
namestring未知曲目默认控件上的音频名字
authorstring未知艺术家默认控件上的作者名字
actionObject执行内部方法,格式:{ method: string, data: value }method可选值play、pause、setCurrentTime、setPlaybackRate

Events

事件名称描述回调函数参数
errorEventHandle当发生错误时触发 error 事件,detail = {errMsg:MediaError.code}
playEventHandle当开始/继续播放时触发 play 事件
pauseEventHandle当暂停播放时触发 pause 事件
timeupdateEventHandle当播放进度改变时触发 timeupdate 事件,detail = {currentTime, duration}
endedEventHandle当播放到末尾时触发 ended 事件

MediaError.code

返回错误码描述
1获取资源被用户禁止
2网络错误
3解码错误
4不合适资源

二、AudioContext

创建 InnerAudioContext 实例。

Audio 音频 - 图2

<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 属性

属性类型默认值说明
srcstring音频资源的地址,用于直接播放
startTimenumber0开始播放的位置(单位:s)
loopbooleanfalse是否循环播放
volumenumber1音量。范围 0~1。
durationnumber当前音频的长度(单位 s)。只有在当前有合法的 src 时返回(只读)
currentTimenumber当前音频的播放位置(单位 s)。只有在当前有合法的 src 时返回,时间保留小数点后 6 位(只读)
pausedboolean当前是是否暂停或停止状态(只读)
bufferednumber音频缓冲的时间点,仅保证当前播放时间点到此时间点内容已缓冲(只读)

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