vue中使用audio标签进行消息提示

本文实现的功能是:有新的消息更新时,页面会播放提示音,提示的声音会播放15秒,然后停止播放,如果在停止播放之前又有新的消息进来,则会重新计时15秒。

首先,添加audio标签,引入资源文件。

<audio id="audio" preload="auto" loop>
  <source src="../assets/alarm.ogg" type="audio/ogg" />
</audio>

在audio标签中存在如下属性:

  • autoplay:是否音频在就绪后马上播放。
  • controls:是否向用户显示控件,比如播放按钮。
  • loop:是否音频结束时重新开始播放。
  • preload:是否音频在页面加载时进行加载,并预备播放。如果使用 "autoplay",则忽略该属性。
  • src:要播放的音频的 URL。

HTML5 audio支持的音频格式有wav,mp3和ogg格式。

  • ogg:一种新的音频压缩格式,是完全免费、开放和没有专利限制的。
  • mp3:是一种音频压缩技术。它被设计用来大幅度地降低音频数据量。
  • wav:为微软公司开发的一种声音文件格式,声音文件质量和CD相差无几。

<source>标签是<audio>的一个子标签,作用就是用来引入多个音频,浏览器会选择一个支持的音频格式进行加载,对于不支持<audio>标签的浏览器,<source>元素也可以作为浏览器不识别的内容加入到文档中。当有多个<source>标签时,默认播放第一个<source>标签。

标签添加完毕以后,就是编写触发事件了。如今如Chrome之类的浏览器,默认情况下,声音自动播放内容会阻止。经过测试,静音的自动播放内容仍会自动播放。使用声音自动播放内容,无论是否具有可见的控件,以及是否设置为循环播放,都不会开始播放。所以我们需要在事件中主动播放音频。播放的代码如下:

play () {
      this.lastRunTime = Date.now()
      let audio = document.querySelector('#audio')
      if (!this.isPlaying) {
        audio.play()
        this.isPlaying = true
      }
      let timeOut = setTimeout(() => {
        this.stop(timeOut)
      }, 15000)
    },
stop (timeOut) {
      this.currentTime = Date.now()
      let audio = document.querySelector('#audio')
      if (this.currentTime - this.lastRunTime < 15000) {
      } else {
        if (this.isPlaying) {
          audio.currentTime = 0
          audio.pause()
          this.isPlaying = false
        }
      }
      clearTimeout(timeOut)
    }

<audio>标签中的控制函数说明:

  • load():加载音频、视频软件,通常不必调用,除非是动态生成的元素,用来在播放前预加载
  • play():加载并播放音频、视频文件,除非文件已经暂停在其他位置,否则默认重头开始播放
  • pause():暂停处于播放状态的音频、视频文件

此处的lastRunTime用于记录最后一次触发play()方法的时间;document.querySelector('#audio')用于返回匹配指定选择器的第一个元素;isPlaying用于判断此时音频是否在播放;setTimeout()方法用于在指定毫秒数后再调用函数或者计算表达式(以毫秒为单位),返回值为该定时器的标识,此处设置15秒以后执行stop(timeOut)方法;currentTime用于记录执行stop()方法的时间,如果this.currentTime - this.lastRunTime < 15000则表明,在播放音频期间有新的消息进入,所以此时不应该停止播放,否则的话就使用audio.currentTime = 0通过赋值0使得当前播放位置清零;无论此时是否要停止播放,我们都要清除定时器,防止内存溢出clearTimeout(timeOut)。

原文地址:https://www.cnblogs.com/yanguangtie/p/10420286.html