zoukankan      html  css  js  c++  java
  • 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)。

  • 相关阅读:
    【STM32F407】第2章 嵌入式网络协议栈基础知识
    【STM32H7】第1章 当前主流的小型嵌入式网络协议栈
    【STM32F429】第1章 当前主流的小型嵌入式网络协议栈
    【STM32F407】第1章 当前主流的小型嵌入式网络协议栈
    Linux(centos)使用docker安装pdf2htmlEX
    JAVA实现查询栏目、类别(菜单)返回树结构(递归)
    maven打包 运行出现 错误: 找不到或无法加载主类 jar
    IDEA版本2020.1全局MAVEN配置
    注解版mybatis动态语句将空字符串转换为null
    Windows系统安装ActiveMQ
  • 原文地址:https://www.cnblogs.com/yanguangtie/p/10420286.html
Copyright © 2011-2022 走看看