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对象。这将立即停止所有声音并将其从缓存中删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础学python:错误与异常

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 语法错误 异常&#xff1a;大多数的异常都不会被程序处理&#xff0c;都以错误信息的形式展现在这里 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ pyth…

Ubuntu源码编译samba

概述 本人最近研究samba的源码&#xff0c;但是在源码编译的时候&#xff0c;本以为直接config,make,make install。没想到编译过程中碰到很多麻烦&#xff0c;主要是各种依赖问题。 基于此&#xff0c;本文把samba编译的详细过程记录下来&#xff0c;以供再次研究借鉴。 软件…

力扣刷题 day50:10-20

1.存在重复元素 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 方法一&#xff1a;集合去重 #方法一&#xff1a;集合去重 def containsDuplicate(nums):return len(n…

AWS SAA-C03考试知识点整理

S3&#xff1a; 不用于数据库功能 分类&#xff1a; S3 Standard &#xff1a;以便频繁访问 S3 Standard-IA 或 S3 One Zone-IA &#xff1a; 不经常访问的数据 Glacier&#xff1a; 最低的成本归档数据 S3 Intelligent-Tiering智能分层 &#xff1a;存储具有不断变化或未知访问…

KubeSphere一键安装部署K8S集群(单master节点)-亲测过

1. 基础环境优化 hostnamectl set-hostname master1 && bash hostnamectl set-hostname node1 && bash hostnamectl set-hostname node2 && bashcat >> /etc/hosts << EOF 192.168.0.34 master1 192.168.0.45 node1 192.168.0.209…

从零开始,学好 Python 从大一新生自我介绍开始

从零开始&#xff0c;学好 Python 从大一新生自我介绍开始 大家好&#xff0c;我叫xxx,今年18岁&#xff0c;刚刚入学不久。我决定从零开始系统学习Python编程语言。 Python是一种解释型、交互式和脚本编程语言。它由荷兰人Guido van Rossum在1991年左右创立&#xff0c;语法简…

Python学习第2天-安装pycharm

文章目录 前言一、下载二、安装1.选择安装目录2.安装配置 总结 前言 好用的工具可以极大地提高生产力&#xff0c;开发Python推荐使用jetbrains全家桶的pycharm。 一、下载 通过官网下载安装包。 二、安装 1.选择安装目录 2.安装配置 一路Next&#xff0c;安装完成 总结 …

模拟最终成绩计算过程

首先输入大于2的整数作为评委人数,然后依次输入每个评委的打分,要求每个分数介于0~100.输入完所有评委打分之后,去掉一个最高分,去掉一个最低分,剩余分数的平均分即为该选手的最终得分 (1) while True:try:n int(input(请输入评委人数:))assert n > 2# 跳出循环breakexce…

快速排序原理JAVA和Scala实现-函数式编程的简洁演示

快速排序原理JAVA和Scala实现-函数式编程的简洁演示 目录 快速排序原理JAVA和Scala实现-函数式编程的简洁演示 C语言快速排序实现 Java 快速排序实现 Scala 快速排序实现 本文章向大家介绍快速排序原理JAVA和Scala实现-函数式编程的简洁演示&#xff0c;主要内容包括C语言…

在Ubuntu上安装和挂载NFS

在Ubuntu上安装和挂载NFS可以按照以下步骤进行&#xff1a; 安装NFS客户端工具&#xff1a;在Ubuntu上&#xff0c;可以使用以下命令安装NFS客户端工具&#xff1a; shell复制代码 sudo apt-get install nfs-common 创建挂载点&#xff1a;在本地Ubuntu计算机上&#xff0c;…

机器学习(23)---Boosting tree(课堂笔记)

文章目录 一、知识记录二、题目2.1 题目12.2 题目22.3 题目三2.4 答案书写 一、知识记录 二、题目 2.1 题目1 2.2 题目2 2.3 题目三 T 4 T_4 T4​中 0.15 0.15 0.15 改为 − 0.16 -0.16 −0.16&#xff0c; − 0.22 -0.22 −0.22 改为 0.11 0.11 0.11。 2.4 答案书写

python 之计算矩阵乘法

文章目录 总的介绍例子 总的介绍 np.matmul 是NumPy库中的矩阵乘法函数&#xff0c;用于执行矩阵乘法操作。矩阵乘法是线性代数中的一种常见操作&#xff0c;用于将两个矩阵相乘以生成新的矩阵。在神经网络、机器学习和科学计算中&#xff0c;矩阵乘法经常用于变换和组合数据。…

点云cloudpoint生成octomap的OcTree的两种方法以及rviz可视化

第一种&#xff1a;在自己的项目中将点云通过ros的topic发布&#xff0c;用octomap_server订阅点云消息&#xff0c;在octomap_server中生成ocTree 再用rviz进行可视化。 创建工作空间&#xff0c;记得source mkdir temp_ocotmap_test/src cd temp_ocotmap_test catkin_make…

算法刷题-数组

算法刷题 209. 长度最小的子数组-二分或者滑动窗口 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度**。**如果不存在符合条件的子数…

进制转换(二进制、八进制、十进制、十六进制)

目录 一&#xff1a;十进制转换为二进制、八进制、十六进制 &#xff08;1&#xff09;整数转换 &#xff08;2&#xff09;小数转换 1&#xff09;十进制转二进制 2&#xff09;十进制转八进制 3&#xff09;十进制转十六进制 二&#xff1a;二进制、八进制、十六进制转…

Python使用scapy库监听指定的网卡数据并转发

监听指定网卡中的数据&#xff08;UDP&#xff09;数据转发 具体实现代码如下&#xff1a; from scapy.all import * from scapy.layers.inet import UDP, IP from scapy.layers.l2 import Etherdef Callback(packet):# 目的IPdst_ip packet[IP].dst# 源IPsrc_ip packet[IP]…

【大模型应用开发教程】02_LangChain介绍

LangChain介绍 什么是 LangChain1. 模型输入/输出2. 数据连接3. 链&#xff08;Chain&#xff09;4. 记忆&#xff08;Meomory&#xff09;5. 代理&#xff08;Agents&#xff09;6.回调&#xff08;Callback&#xff09;在哪里传入回调 ?你想在什么时候使用这些东西呢&#x…

Stable diffusion的一些参数意义及常规设置

在线stabel Diffusion模型 https://huggingface.co/spaces/stabilityai/stable-diffusion 随机种子 seed 如果想要同一个文本提示&#xff0c;生成多次都是同一图像&#xff0c;可以设置一个随机种子&#xff0c;类似于random.seed()的原理&#xff0c;并将生成器传递给管道…

A_搜索(A Star)算法

A*搜索(A Star) 不同于盲目搜索&#xff0c;A算法是一种启发式算法(Heuristic Algorithm)。 上文提到&#xff0c;盲目搜索对于所有要搜索的状态结点都是一视同仁的&#xff0c;因此在每次搜索一个状态时&#xff0c;盲目搜索并不会考虑这个状态到底是有利于趋向目标的&#x…

​CUDA学习笔记(五)GPU架构

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 GPU架构 SM&#xff08;Streaming Multiprocessors&#xff09;是GPU架构中非常重要的部分&#xff0c;GPU硬件的并行性就是由SM决定的。 以Fermi架构为例&#xff0c;其包含以下主要组成…