首页 前端知识 Howler.js HTML5声音引擎

Howler.js HTML5声音引擎

2024-05-10 08:05:59 前端知识 前端哥 406 256 我要收藏

介绍

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

转载请注明出处或者链接地址:https://www.qianduange.cn//article/7946.html
标签
评论
会员中心 联系我 留言建议 回顶部
复制成功!