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

【前端】HTML5 Audio 预加载 按照队列顺序播放音频, 可以陆续往队列中加内容

【前端】Audio 按照队列顺序播放音频, 可以陆续往队列中加内容

var 音频库 = {}

var 当前音频集合 = []

/*** 将文本添加到队列中* 持续去播放* 播放过的音频会自动从队列中删除* * 已规划* 要保障同时进行加载的数据不能超过5个(线程池 5)* * @param 文本*/播放音频队列(文本){if(!文本){return}let that = thistry {// var audio = document.getElementById("bgMusic");//将文本的标签形式去掉let introduce = 文本.replace(/<.*?>/g,"")console.log(introduce)if(introduce){let list = []//通过, 。等进行分割introduce.split(/,|\.|;|,|。|;|\n/).forEach(str =>{if(str && str.trim().length >= 1){list.push(str.trim())}})//总数量var 数量 = list.length// that.当前音频集合 = []for (let i = 0; i < 数量; i++) {var audio = null;//缓存库如果存在的话 则直接走缓存  不用再去加载了if(that.音频库[list[i]]){audio = that.音频库[list[i]]}else{audio = new Audio();/*** 数据加载完毕  需要看是否继续加载其他数据* 这里后续扩展  并行数量限制*/audio.onloadedmetadata = function() {console.log("loadedmetadata, 加载完毕")}//这一步会加载数据audio.src='https://dds.dui.ai/runtime/v1/synthesize?voiceId=yukaimp&text='+list[i]+'&speed=1&volume=100&audioType=wav';that.音频库[list[i]] = audio}/*** 音频播放完成的事件* 判断队列中是否还有, 有的话 就继续播放*/audio.onended = function() {that.当前音频集合.shift()if(that.当前音频集合.length >= 1){that.当前音频集合[0].play()}};that.当前音频集合.push(audio);}/*** 判断当前是否有在播放音频, 没有的话 就播放第一个*/if(that.当前音频集合 && that.当前音频集合.length >= 1 && that.当前音频集合[0].paused){//没有播放 需要播放that.当前音频集合[0].play()}}}catch (e){}},

<audio> 标签支持很多的事件来让我们了解音频的加载以及播放进度。最常用的事件有:

  1. loadedmetadata: 元数据加载完成。
  2. canplay: 浏览器已经可以播放音频,但是预测加载的数据不足以在不暂停的情况下顺利将其播放到结束。
  3. canplaythrough: 浏览器预测已经可以在不暂停的前提下将音频播放到结束。
  4. stalled: 用户代理是图获取音频数据,但数据意外地没有进入。
  5. suspend: 音频加载挂起。
  6. play: 播放开始。
  7. pause: 播放暂停。
  8. waiting: 因为暂时性缺少数据,播放暂停。
  9. playing: 因缺少数据而暂停或延迟的状态结束,播放准备开始。
  10. seeking: 一次获取操作开始。
  11. seeked: 一次获取操作结束。
  12. ratechange: 播放速率变化。
  13. timeupdate: HTMLAudioElement.currentTime 属性指定的时间更新。
  14. volumechange: 音量变化。
  15. ended: 播放到音频的结束为止,播放停止。

http://www.lryc.cn/news/180527.html

相关文章:

  • 【单片机】13-实时时钟DS1302
  • springboot和vue:十三、VueX简介与安装与推荐视频+前端数据模拟MockJS
  • [React] Zustand状态管理库
  • 【ChatGPT】ChatGPT发展历史
  • 分布式文件存储系统Minio实战
  • 【MySQL】MySQL 官方安装包形式
  • 使用sqlmap获取数据步骤
  • [论文笔记]GLM
  • 漏洞扫描环境:win10系统用VMware Workstation打开虚拟机若干问题
  • OpenCV实现模板匹配和霍夫线检测,霍夫圆检测
  • 消息队列实现进程之间通信方式
  • 用简单例子讲清楚webgl模板测试
  • 区块链(8):p2p去中心化之websoket服务端实现业务逻辑
  • composer安装与设置
  • unordered_map/unordered_set的学习[unordered系列]
  • C++位图—布隆过滤器
  • SQL SELECT 语句进阶
  • Mac程序坞美化工具 uBar
  • 【数据结构】排序之插入排序和选择排序
  • 6.html表单
  • 【python学习第11节:numpy】
  • Eclipse 主网即将上线迎空投预期,Zepoch 节点或成受益者?
  • JavaSE | 初识Java(四) | 输入输出
  • 车牌超分辨率:License Plate Super-Resolution Using Diffusion Models
  • 如何制作在线流程图?6款在线工具帮你轻松搞定
  • 反SSDTHOOK的另一种思路-0环实现自己的系统调用
  • Certbot签发和续费泛域名SSL证书(通过DNS TXT记录来验证域名有效性)
  • PY32F003F18之RTC
  • redis主从从,redis-7.0.13
  • 力扣-338.比特位计数