vue 音频组件

一、概述

因项目要求,需要做一个音频播放器。

二、demo

test.vue

<template>
  <div>
    <img src="../assets/audio-bg.png" alt="">
    <br>
    <!-- 此处的ref属性,可以很方便的在vue组件中通过 this.$refs.audio获取该dom元素 -->
    <audio ref="audio"
           @pause="onPause"
           @play="onPlay"
           @timeupdate="onTimeupdate"
           @loadedmetadata="onLoadedmetadata"
           src="https://wdd.js.org/element-audio/static/falling-star.mp3"
           controls="controls">

    </audio>

    <!-- 音频播放控件 -->
<!--    <div>-->
<!--      <el-button type="text" @click="startPlayOrPause">{{audio.playing | transPlayPause}}</el-button>-->

<!--      <el-tag type="info">{{ audio.currentTime | formatSecond}}</el-tag>-->

<!--      <el-tag type="info">{{ audio.maxTime | formatSecond}}</el-tag>-->
<!--    </div>-->
  </div>
</template>

<script>

  // 将整数转换成 时:分:秒的格式
  function realFormatSecond(second) {
    var secondType = typeof second

    if (secondType === 'number' || secondType === 'string') {
      second = parseInt(second)

      var hours = Math.floor(second / 3600)
      second = second - hours * 3600
      var mimute = Math.floor(second / 60)
      second = second - mimute * 60

      return hours + ':' + ('0' + mimute).slice(-2) + ':' + ('0' + second).slice(-2)
    } else {
      return '0:00:00'
    }
  }

  export default {
    data () {
      return {
        audio: {
          // 该字段是音频是否处于播放状态的属性
          playing: false,
          // 音频当前播放时长
          currentTime: 0,
          // 音频最大播放时长
          maxTime: 0
        }
      }
    },
    methods: {
      // 控制音频的播放与暂停
      startPlayOrPause () {
        return this.audio.playing ? this.pause() : this.play()
      },
      // 播放音频
      play () {
        this.$refs.audio.play()
      },
      // 暂停音频
      pause () {
        this.$refs.audio.pause()
      },
      // 当音频播放
      onPlay () {
        this.audio.playing = true
      },
      // 当音频暂停
      onPause () {
        this.audio.playing = false
      },
      // 当timeupdate事件大概每秒一次,用来更新音频流的当前播放时间
      onTimeupdate(res) {
        console.log('timeupdate')
        console.log(res)
        this.audio.currentTime = res.target.currentTime
      },
      // 当加载语音流元数据完成后,会触发该事件的回调函数
      // 语音元数据主要是语音的长度之类的数据
      onLoadedmetadata(res) {
        console.log('loadedmetadata')
        console.log(res)
        this.audio.maxTime = parseInt(res.target.duration)
      }
    },
    filters: {
      // 使用组件过滤器来动态改变按钮的显示
      transPlayPause(value) {
        return value ? '暂停' : '播放'
      },
      // 将整数转化成时分秒
      formatSecond(second = 0) {
        return realFormatSecond(second)
      }
    }
  }
</script>

<style>

</style>
View Code

注意:这里有一张背景图片,大家可以从百度中下载。

效果如下:

这里的功能有几个:开始/暂停,显示音频时长,设置音量大小,设置播放倍数。

关于更多代码的解释,请查看下面的参考链接,里面有详细的描述,这里就不在叙述了。

本文参考链接:

https://segmentfault.com/a/1190000012453975

### 如何在Vue2中创建或使用音频组件 #### 创建自定义音频播放器组件 为了在 Vue2 中创建一个自定义音频播放器组件,可以利用现有的库或者手动构建。以下是两种常见的方法: 1. **基于现有库的实现** 使用已有的 Vue 音频播放器组件库,例如 `vue-audio-player` 或者 `vue-html5-audio` 等工具。这些库提供了开箱即用的功能和灵活的配置选项。 安装依赖: ```bash npm install vue-audio-better --save ``` 在 Vue 组件中引入并使用: ```javascript import Vue from 'vue'; import VueAudioBetter from 'vue-audio-better'; Vue.use(VueAudioBetter); ``` 在模板中使用: ```html <template> <div> <audio controls :src="audioSrc"></audio> </div> </template> <script> export default { data() { return { audioSrc: '/path/to/audio/file.mp3' // 替换为实际路径[^4] }; } }; </script> ``` 2. **手动实现自定义音频播放器** 如果希望完全控制音频播放的行为,可以选择手动编写逻辑。这通常涉及操作原生 `<audio>` 元素及其事件。 下面是一个简单的例子: ```html <template> <div> <button @click="togglePlay">播放/暂停</button> <audio ref="audioPlayer" src="/path/to/audio/file.mp3"></audio> <!-- 替换为实际路径 --> </div> </template> <script> export default { methods: { togglePlay() { const player = this.$refs.audioPlayer; if (player.paused) { player.play(); // 开始播放 } else { player.pause(); // 暂停播放 } } }, mounted() { const player = this.$refs.audioPlayer; // 添加 canplay 事件监听器 player.addEventListener('canplay', () => { console.log('音频已经准备好播放'); }); } }; </script> ``` #### 关键点解析 - **事件处理** 在开发音频播放器时,了解音频加载过程中的常见事件非常重要。例如,`canplay` 和 `canplaythrough` 事件可以帮助判断音频是否准备就绪以及能否流畅播放[^5]。 - **跨平台兼容性** 考虑到不同设备和浏览器的支持情况,建议测试目标环境下的行为表现。特别是对于旧版浏览器(如 IE),需注意其对某些事件的支持程度。 - **资源管理** 将音频文件放置在项目的 `public` 文件夹下是一种常用做法,这样可以直接通过相对路径访问文件而无需经过 Webpack 的打包流程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值