当前位置: 首页 > news >正文

Vue 使用Audio或AudioContext播放本地音频

使用Audio 第一种 使用标签方式
    <audio src="./tests.mp3" ref="audio"></audio><el-button @click="audioPlay()">播放Audio</el-button>audioPlay() {this.$refs.audio.currentTime = 0;this.$refs.audio.play();// this.$refs.audio.pause(); //暂停},
使用Audio 第二种 利用js构建Audio对象
audioJs() {var audio = new Audio();var url = require("./tests.mp3");audio.src = url;// audio.loop = true; //设置循环播放audio.play();// audio.pause(); //暂停
},
使用AudioContext播放
<template><div><el-button @click="playAudio()" v-show="!hasPlay">播放</el-button><el-button @click="resumeAudio()" v-show="hasPlay">{{isPause ? "继续" : "暂停"}}</el-button><el-button @click="stopAudio()" v-show="hasPlay">结束</el-button></div>
</template><script>
export default {data() {return {ctx: null,source: null,loop: false, //是否循环hasPlay: false, //是否播放 助变量 可忽略辅isPause: false, //是否暂停 助变量 可忽略辅};},methods: {// 播放async playAudio() {this.ctx = new (window.AudioContext || window.webkitAudioContext())();this.source = this.ctx.createBufferSource(); // 创建音频源头姐点const audioBuffer = await this.loadAudio();this.playSound(audioBuffer);},async loadAudio() {// const audioUrl = require("./test.mp3");const audioUrl = require("./tests.mp3");const res = await fetch(audioUrl);const arrayBuffer = await res.arrayBuffer(); // byte array字节数组const audioBuffer = await this.ctx.decodeAudioData(arrayBuffer,function (decodeData) {return decodeData;});return audioBuffer;},async playSound(audioBuffer) {this.source.buffer = audioBuffer; // 设置数据this.source.loop = this.loop; //设置,循环播放this.source.connect(this.ctx.destination); // 头尾相连// 可以对音频做任何控制this.source.start(0); //立即播放this.hasPlay = true;},// 暂停async resumeAudio() {if (this.ctx.state === "running") {this.ctx.suspend();this.isPause = true;} else if (this.ctx.state === "suspended") {this.ctx.resume();this.isPause = false;}},// 结束async stopAudio() {this.source.stop();this.hasPlay = false;this.isPause = false;},},
};
</script>
需要注意的是,以谷歌播放器为例,用户还没有跟document产生交互时,不允许播放器执行播放操作的,具体解决方案可另行查询,这边建议做一个类似弹窗的东西,引导用户产生交互动作。以上三个例子均由点击事件触发播放,因此不存在上述问题。
http://www.lryc.cn/news/396835.html

相关文章:

  • 从数据仓库到数据湖(上):数据湖导论
  • Perl 语言开发(六):深入探索 Perl 中的数组与列表操作
  • 统一视频接入平台LntonCVS视频监控平台具体功能介绍
  • redis的Bitmap 、HyperLogLog、Geo相关命令和相关场景
  • ✅小程序申请+备案教程
  • Google Guava Cache简介
  • githup开了代理push不上去
  • 【python】保存列表、字典数据到本地文件,以txt、json和pickle为例
  • 每日新闻掌握【2024年7月9日 星期二】
  • 数据结构——Trie
  • 前端根据目录生成模块化路由routes
  • Blender新手入门笔记收容所(一)
  • 修改服务器挂载目录
  • Linux+InternStudio 关卡
  • 如何提升美国Facebook直播的整体体验?
  • flutter项目与原生项目相比,性能比较差的原因
  • 第二周:李宏毅机器学习笔记
  • 搜维尔科技:【研究】Scalefit是一款可在工作场所自动处理3D姿势分析结果的软件
  • 网络编程:各协议头(数据报格式)
  • SpringBoot报错:The field file exceeds its maximum permitted size of 1048576 bytes
  • C++的介绍与认识
  • Spark源码详解
  • 浅尝Apache Mesos
  • buuctf题目讲解-1
  • 软件测试学习之-ADB命令
  • Redis的入门导读(一)
  • H5与小程序:两者有何不同?
  • 计算机视觉、目标检测、视频分析的过去和未来:目标检测从入门到精通 ------ YOLOv8 到 多模态大模型处理视觉基础任务
  • 7月10日学习打卡,环形链表+栈OJ
  • 鸿蒙语言基础类库:【@ohos.util.TreeSet (非线性容器TreeSet)】