Howler.js HTML5声音引擎
介绍
Howler.js是一个不错的HTML5声音引擎。功能强大,性能不错,用起来也很方便。
1. 官网
https://howlerjs.com/
GitHub
https://github.com/goldfire/howler.js
2. 兼容性
Howler默认使用Web Audio,但在IE上可以自动转为HTML 5 Audio。这点很是贴心。
3. 声音激活
移动端的Safari和Chrome都禁止网页自动播放声音,必须通过用户的操作,touch, click等触发。Howler可以设置成自动捕捉用户操作激活(解禁)声音播放。
4. 声音格式
Howler.js支持很多声音格式以兼容各种浏览器。MP3, MPEG, OPUS, OGG, OGA, WAV, AAC, CAF, M4A, MP4, WEBA, WEBM, DOLBY, FLAC.
5. 声音精灵
Howler 支持声音精灵。
GitHub上的audiosprite,一个基于ffmpeg的声音编译工具(https://github.com/tonistiigi/audiosprite)直接支持生成Howler格式的声音精灵,而且有诸多参数可选,可同时输出多种格式,Howler.js可以根据浏览器的支持来选择用哪个声音格式。
注意Howler.js选择声音格式的顺序是声音精灵json描述文件的顺序,即你生成声音精灵时写的顺序。
6. 其他特点
支持3D游戏、自动缓存、支持淡入淡出效果、轻量、纯JS、无第三方依赖、模块化
日常开发中,解决一些细节问题
1. 苹果手机、安卓手机,自动播放的问题
如果尝试在页面上自动播放音频,可以侦听playerror 活动然后等待unlock 再次尝试播放音频:
var sound = new Howl({src: ['sound.mp3'],autoplay: true,loop: true,// volume: 0.5,onplayerror: function() {sound.once('unlock', function() {sound.play();});}
});
// sound.play(); // autoplay: true, 时此行可以不用设置
经测试,苹果手机、安卓手机在微信浏览器中均可自动播放背景音乐,但Chrome浏览器中需要在页面中点击后才可以播放音乐。
2. 播放延迟处理
- 苹果手机点击按钮音频播放延迟
- 普通H5游戏如接物游戏,当接到物品得分失分音效衔接播放时,延迟不连贯
- 普通H5声音循环周期间衔接往往有延迟不连贯
使用 Howler.js 对于延迟处理效果比较不错
例:
var soundYes = new Howl({src: ['game/yes.mp3']
});
var soundNo = new Howl({src: ['game/no.mp3']
});
......
......
if(this.down_img.score > 0){soundYes.play();
}else{soundNo.play();
}
......
安装 Howler.js
npm 安装: npm install howler
Yarn 安装: yarn add howler
Bower 安装: bower install howler
从属关系:
import {Howl, Howler} from 'howler';
或
const {Howl, Howler} = require('howler');
使用
项目 中引入、使用 Howler.js
import {Howl} from 'howler';
基础示例:
var sound = new Howl({src: ['sound.webm', 'sound.mp3']
});
sound.play();
<script> 中引入、使用 Howler.js
CDN引用 或 下载: https://cdnjs.com/libraries/howler
最新版本下载 howler.js | howler.min.js: https://github.com/goldfire/howler.js/tree/master/dist
基础示例:
<script src="/path/to/howler.js"></script>
<script>var sound = new Howl({src: ['sound.webm', 'sound.mp3']});sound.play();
</script>
示例
最基本的播放MP3:
var sound = new Howl({src: ['sound.mp3']
});sound.play();
流音频(用于现场音频或大型文件):
var sound = new Howl({src: ['sound.mp3'],html5: true
});sound.play();
更多播放选项:
var sound = new Howl({src: ['sound.webm', 'sound.mp3', 'sound.wav'],autoplay: true,loop: true,volume: 0.5,onend: function() {console.log('Finished!');}
});
定义并演奏一个声音精灵:
var sound = new Howl({src: ['sounds.webm', 'sounds.mp3'],sprite: {blast: [0, 3000],laser: [4000, 1000],winner: [6000, 5000]}
});sound.play('laser');
侦听事件:
var sound = new Howl({src: ['sound.webm', 'sound.mp3']
});// 第一次执行后清除侦听器
sound.once('load', function(){sound.play();
});// 当声音播放完毕时
sound.on('end', function(){console.log('Finished!');
});
控制多重声音:
var sound = new Howl({src: ['sound.webm', 'sound.mp3']
});// Play返回可以传递的唯一声音ID
// 进入Howl上的任何方法来控制特定的声音
var id1 = sound.play();
var id2 = sound.play();// 淡出第一个声音,加快第二个声音
sound.fade(1, 0, 1000, id1);
sound.rate(1.5, id2);
ES6:
import {Howl, Howler} from 'howler';const sound = new Howl({src: ['sound.webm', 'sound.mp3']
});// 播放声音
sound.play();// 更改全局音量
Howler.volume(0.5);
方法
play([sprite/id])
开始播放声音。返回要与其他方法一起使用的声音标识。
sprite/id :String/Number 可选 获取一个参数,该参数可以是精灵或声音ID。如果传递了精灵,将根据精灵的定义播放新的声音。如果通过了声音ID,则会播放以前播放的声音(例如,在暂停后)。但是,如果通过了从池中排出的声音的ID,则不会播放任何内容。
pause([id])
暂停声音或组的播放,保存播放的搜索。
id :Number 可选 声音标识。如果没有,组中的所有声音都暂停。
stop([id])
停止播放声音。
id :Number 可选 声音标识。如果没有,组内的所有声音都会停止。
mute([muted], [id])
减少声音,但不暂停播放。
muted :Boolean 可选 布尔可选True用于静音,false用于取消静音。
id :Number 可选 声音标识。如果没有,组内的所有声音都会停止。
volume([volume], [id])
获取/设置此声音或组的音量。此方法可选地接受0、1或2个参数。
volume :Number 可选 数量0.0 到1.0
id :Number 可选 声音标识。如果没有,组中的所有声音都相对于它们自己的音量改变.
fade(from, to, duration, [id])
在两个音量之间衰减当前播放的声音。完成后激发淡入淡出事件。
from :Number 要从(0.0到1.0)淡入的数字音量。
to :Number 要淡入的数量音量(0.0到1.0)。
duration :Number 数字淡入淡出的时间(以毫秒为单位)。
id :Number 可选 声音标识。如果没有,组中的所有声音都会消失。
rate([rate], [id])
获取/设置声音的播放速率。此方法可选地接受0、1或2个参数。
rate :Number 可选 播放速率。0.5至4.0,1.0为正常速度。
id :Number 可选 声音标识。如果没有,组中所有声音的播放速率就会改变。
seek([seek], [id])
获取/设置声音的播放位置。此方法可选地接受0、1或2个参数。
seek :Number 可选 将当前播放移动到的位置(以秒为单位)。
id :Number 可选 声音标识。如果没有,将查找第一个声音。
loop([loop], [id])
获取/设置是循环播放声音还是分组。此方法可以选择采用0、1或2个参数。
loop :Boolean 可选 循环或不循环。
id :Number 可选 声音标识。如果没有,组中的所有声音都将更新其循环属性。
state()
检查Howl的加载状态,返回unloaded ,loading 或loaded
playing([id])
检查声音是否正在播放,返回Boolean.如没有发出声音标识,请检查组中是否有声音正在播放。
id :Number 可选 要检查的声音标识。
duration([id])
获取音频源的持续时间(以秒为单位)。将返回0,直到加载事件激发之后。
id :Number 可选 要检查的声音id。传递ID将返回在该实例上播放的精灵的持续时间;否则,将返回完整的源持续时间。
on(event, function, [id])
侦听事件发生。可以通过多次调用来添加多个事件。
event :String 字符串要激发/设置的事件的名称(load ,loaderror ,playerror ,play ,end ,pause ,stop ,mute ,volume ,rate ,seek ,fade ,unlock ).
function :Function 函数定义要在事件中激发的函数。
id :Number 可选 只为这个声音标识侦听事件。
once(event, function, [id])
与on相同 ,但在回调启动后它会自动删除(删除自己)。
event :String 字符串要激发/设置的事件的名称(load ,loaderror ,playerror ,play ,end ,pause ,stop ,mute ,volume ,rate ,seek ,fade ,unlock ).
function :Function 函数定义要在事件中激发的函数。
id :Number 可选 只为这个声音标识侦听事件。
off(event, [function], [id])
删除您设置的事件侦听器。无参数调用删除所有事件。
event :String 字符串事件名称(load ,loaderror ,playerror ,play ,end ,pause ,stop ,mute ,volume ,rate ,seek ,fade ,unlock ).
function :Function 可选 要删除的侦听器。忽略此项可删除类型的所有事件。
id :Number 可选 只为这个声音标识删除事件。
load()
这是默认情况下调用的,但如果将preload设置为false,则必须调用load才能播放任何声音。
unload()
卸载并销毁Howl对象。这将立即停止所有附加到此声音的声音,并将其从缓存中删除。
全局方法
mute(muted)
将所有声音静音或取消静音。
muted: Boolean True表示静音,false表示取消静音。
volume([volume])
获取/设置所有声音相对于其自身音量的全局音量。
volume: Number 数量0.0 到1.0
stop()
停止所有声音并将它们的搜索位置重置为起始位置。
codecs(ext)
检查支持的音频编解码器。如果当前浏览器支持编解码器,则返回true。
ext: 字符串文件扩展名。其中之一: "mp3", "mpeg", "opus", "ogg", "oga", "wav", "aac", "caf", "m4a", "m4b", "mp4", "weba", "webm", "dolby", "flac"
unload()
卸载并销毁所有当前加载的Howl对象。这将立即停止所有声音并将其从缓存中删除。
相关文章:
Howler.js HTML5声音引擎
介绍 Howler.js是一个不错的HTML5声音引擎。功能强大,性能不错,用起来也很方便。 1. 官网 https://howlerjs.com/ GitHub https://github.com/goldfire/howler.js 2. 兼容性 Howler默认使用Web Audio,但在IE上可以自动转为HTML 5 Audio。这…...
centos 7.9每天定期发送最新备份文件到另外一台服务器
1.需求 在本地化部署的过程中,为了使系统相对来说高可用,一般情况下,我们都会做一个负载,但是客户又会考虑成本,所以只有可怜巴巴的两台服务器,要全部服务都做负载,这个就实现不了。所以只能把…...
一文全面了解:一个神奇的 react-antd-admin 动态菜单
在React v18中使用React Router v6和Ant Design (antd) v5来动态生成菜单和路由,同时使用MockJS来模拟接口请求菜单数据,可以按照以下步骤进行: 创建一个React应用: 使用Create React App或您喜欢的其他方式创建一个React应用。 安装必要的依赖: 在项目目录中运行以下命令…...
二叉树,堆排序及TopK问题
要讲二叉树的概念,就要先讲树的概念。 树是什么呢? 树其实是一种储存数据的结构,因为他的结构倒过来和生活中的树很相似所以才被称之为树。 这是一颗多叉树,从最顶端的节点可以找到下边的几个节点,下边的节点又可以找…...
iphone xr密码错误太多次 连接itunes
itunes下载的固件在电脑在电脑的“C:\Users\用户名\AppData\Roaming\Apple Computer\iTunes\iPhone Software Updates”文件夹之中。 如果你忘记了 iPhone 密码 - 官方 Apple 支持 (中国) 下载和使用 Windows 10 版 iTunes - 官方 Apple 支持 (中国) 查找手机 iClo…...
设置RabbitMQ超时时间
RabbitMQ默认的超时时间是30分钟,在消息消费超过30分钟后,rabbitMQ会发生错误,导致整个channel被销毁,无法继续消费 在RabbitMQ安装的终端执行 rabbitmqctl eval application:set_env(rabbit,consumer_timeout,180000000). 命令…...
QT计时器
widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //计时器类 #include <QTime> //时间类 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widg…...
3-k8s-镜像仓库harbor搭建
文章目录 一、概念二、安装harbor三、使用harbor仓库 一、概念 官方概念:Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器。 我们平时拉去镜像都是从线上仓库拉去,但是企业内部的镜像一般都不会随意传到网上,而是保存在自己公…...
0基础学习PyFlink——模拟Hadoop流程
学习大数据还是绕不开始祖级别的技术hadoop。我们不用了解其太多,只要理解其大体流程,然后用python代码模拟主要流程来熟悉其思想。 还是以单词统计为例,如果使用hadoop流程实现,则如下图。 为什么要搞这么复杂呢? 顾…...
【无人机】太阳能伪卫星VoLTE无人机设计(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
2023.10.20 LED驱动
驱动程序 #include<linux/init.h> #include<linux/module.h> #include<linux/fs.h> #include<linux/uaccess.h> #include<linux/io.h> #include"head.h"unsigned int major; unsigned int *vir_moder; unsigned int *vir_odr; unsign…...
【力扣刷题】回文链表、环形链表、合并两个有序链表
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 刷题篇 一、回文链表1.1 题目描述1.2 思路分…...
linux错误处理函数
linux c之perror、exit_perror与exit-CSDN博客 linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写-阿里云开发者社区 函数简介篇——错误处理函数:errno值、perror()、streeor()、streeor_r()_惺忪牛犊子的博客-CSDN博客...
vue2技能树(5)-条件渲染和列表渲染
目录 Vue 2 条件渲染详解v-if 和 v-else 指令项目示例 v-show 指令项目示例 v-if 和 v-show 的区别v-if 和 v-else-if 指令项目示例 Vue 2 列表渲染详解v-for 指令项目示例 计算属性和方法项目示例 v-bind:key项目示例 使用对象的v-for项目示例 v-for 的索引项目示例 …...
MySQL基本操作之创建数据库
1、大小写敏感 一般大家都默认使用:小写 在MySQL中,大小写敏感性有两个方面的规定:lower_case_file_system和lower_case_table_names。 lower_case_file_system:指定操作系统文件系统是否对大小写敏感。 当设置为ON时,表示文件系统对大小写不敏感;当设置为OFF时,表示…...
8.对象贴地
愿你出走半生,归来仍是少年! 在场景中,有时候需要对地物(房屋、楼宇)进行贴地处理,或者说相对地面高度(井盖、井室)进行设置。 通过自定义的Terrain切片以及影像瓦片构建的三维场景应该如何获取…...
AWS Lambda – 函数版本,别名,API网关,CodeDeploy协同
Hello大家好,我们今天继续讨论AWS Lambda的内容。 Lambda函数的版本 Lambda函数的版本和别名是辅助资源,我们可以通过创建这些资源管理函数的部署和调用。 首先,让我们来看一下Lambda 函数版本的概念。您可以使用版本来管理函数的部署。例…...
flutter doctor检测环境,出现CocoaPods installed but not working
1. 安装flutter, 地址: 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2. 安装成功后,通过flutter doctor检测环境。以mac为例,出现了CocoaPods installed but not working 错误提示时,以下为解决方案: 2.1 rvm i…...
Python 条件和 if 语句
Python支持来自数学的通常逻辑条件: 等于:a b不等于:a ! b小于:a < b小于或等于:a < b大于:a > b大于或等于:a > b 这些条件可以以多种方式使用,最常见的是在"i…...
行业领先的三个企业正在利用聊天机器人变得更强
聊天机器人已成为客户服务领域的革命者,深刻地改变了企业与客户互动的方式。这些虚拟助手简化了交互,提供了24/7全天候高效和个性化的支持。凭借先进的技术和自然语言处理能力,聊天机器人擅长快速处理查询。 效率是聊天机器人的关键优势。它…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
