【前端】Audio 按照队列顺序播放音频, 可以陆续往队列中加内容
var 音频库 = {}
var 当前音频集合 = []
- /**
- * 将文本添加到队列中
- * 持续去播放
- * 播放过的音频会自动从队列中删除
- *
- * 已规划
- * 要保障同时进行加载的数据不能超过5个(线程池 5)
- *
- * @param 文本
- */
- 播放音频队列(文本){
- if(!文本){
- return
- }
- let that = this
- try {
- // 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){
- }
-
-
- },
标签支持很多的事件来让我们了解音频的加载以及播放进度。最常用的事件有:
loadedmetadata
: 元数据加载完成。canplay
: 浏览器已经可以播放音频,但是预测加载的数据不足以在不暂停的情况下顺利将其播放到结束。canplaythrough
: 浏览器预测已经可以在不暂停的前提下将音频播放到结束。stalled
: 用户代理是图获取音频数据,但数据意外地没有进入。suspend
: 音频加载挂起。play
: 播放开始。pause
: 播放暂停。waiting
: 因为暂时性缺少数据,播放暂停。playing
: 因缺少数据而暂停或延迟的状态结束,播放准备开始。seeking
: 一次获取操作开始。seeked
: 一次获取操作结束。ratechange
: 播放速率变化。timeupdate
: HTMLAudioElement.currentTime
属性指定的时间更新。volumechange
: 音量变化。ended
: 播放到音频的结束为止,播放停止。