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


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

    var 音频库 = {}

    var 当前音频集合 = []

    1. /**
    2. * 将文本添加到队列中
    3. * 持续去播放
    4. * 播放过的音频会自动从队列中删除
    5. *
    6. * 已规划
    7. * 要保障同时进行加载的数据不能超过5个(线程池 5)
    8. *
    9. * @param 文本
    10. */
    11. 播放音频队列(文本){
    12. if(!文本){
    13. return
    14. }
    15. let that = this
    16. try {
    17. // var audio = document.getElementById("bgMusic");
    18. //将文本的标签形式去掉
    19. let introduce = 文本.replace(/<.*?>/g,"")
    20. console.log(introduce)
    21. if(introduce){
    22. let list = []
    23. //通过, 。等进行分割
    24. introduce.split(/,|\.|;|,|。|;|\n/).forEach(str =>{
    25. if(str && str.trim().length >= 1){
    26. list.push(str.trim())
    27. }
    28. })
    29. //总数量
    30. var 数量 = list.length
    31. // that.当前音频集合 = []
    32. for (let i = 0; i < 数量; i++) {
    33. var audio = null;
    34. //缓存库如果存在的话 则直接走缓存 不用再去加载了
    35. if(that.音频库[list[i]]){
    36. audio = that.音频库[list[i]]
    37. }else{
    38. audio = new Audio();
    39. /**
    40. * 数据加载完毕 需要看是否继续加载其他数据
    41. * 这里后续扩展 并行数量限制
    42. */
    43. audio.onloadedmetadata = function() {
    44. console.log("loadedmetadata, 加载完毕")
    45. }
    46. //这一步会加载数据
    47. audio.src='https://dds.dui.ai/runtime/v1/synthesize?voiceId=yukaimp&text='+list[i]+'&speed=1&volume=100&audioType=wav';
    48. that.音频库[list[i]] = audio
    49. }
    50. /**
    51. * 音频播放完成的事件
    52. * 判断队列中是否还有, 有的话 就继续播放
    53. */
    54. audio.onended = function() {
    55. that.当前音频集合.shift()
    56. if(that.当前音频集合.length >= 1){
    57. that.当前音频集合[0].play()
    58. }
    59. };
    60. that.当前音频集合.push(audio);
    61. }
    62. /**
    63. * 判断当前是否有在播放音频, 没有的话 就播放第一个
    64. */
    65. if(that.当前音频集合 && that.当前音频集合.length >= 1 && that.当前音频集合[0].paused){
    66. //没有播放 需要播放
    67. that.当前音频集合[0].play()
    68. }
    69. }
    70. }catch (e){
    71. }
    72. },

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

    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: 播放到音频的结束为止,播放停止。

  • 相关阅读:
    MySQL数据库——第四节 — MySQL表的增删改查(进阶)
    java计算机毕业设计洁能租车源码+mysql数据库+系统+lw文档+部署
    全网没有之一的API 文档:Swagger
    shell脚本耕升(一)
    文件包含漏洞和hash破解
    设计模式:命令模式
    编程面试_动态规划
    HTML5 —— 初识 Canvas 画布
    解决window电脑使用IKE VPN登录时显示上下文已过期,不能再用了的方法。
    npm ERR! code ERESOLVE错误解决
  • 原文地址:https://blog.csdn.net/G971005287W/article/details/133339858