)
音视频前端【免费下载链接】howler.jsJavascript audio library for the modern web.项目地址https://gitcode.com/gh_mirrors/ho/howler.js点击查看免费下载导读本文以 howler.js 仓库中的 CHANGELOG.md 为主线系统梳理这款 JavaScript 音频库从 1.0.02013 年到 2.2.32023 年十年间的技术演进v2.0 引入的Howler → Howl → Sound三层架构、命名与 API 的 Breaking Changes、Spatial 插件的模块化拆分以及围绕移动端音频解锁、循环播放、淡入淡出等高频问题的修复脉络。读完本文你将掌握 howler.js 各版本的核心能力差异、旧代码迁移要点并能结合仓库源码src/howler.core.js、src/plugins/howler.spatial.js理解其底层实现原理。一、这份 CHANGELOG 在讲什么CHANGELOG 记录了 howler.js 从首个提交1.0.02013 年 1 月到 2.2.3 的全部版本变更是理解这个项目设计哲学的技术路线图。结合 package.json 与 src/howler.core.js 头部注释可以看到当前仓库的实际版本为 2.2.4因此 CHANGELOG 中记录的所有 2.x 能力在当前源码中均可验证。梳理 CHANGELOG 可以发现三条清晰的主线架构演进v2.0 从单一声音对象重写为全局-分组-单声三层模型并引入插件机制API 收敛多次 Breaking Changes 将冗余方法fadeIn/fadeOut、mute/unmute合并为统一接口兼容性加固持续修复移动端自动解锁、各浏览器循环/淡入淡出/空间音频的 edge case。二、v2.0 里程碑三层音频架构的诞生v2.02016 年 7 月是 CHANGELOG 中篇幅最大、影响最深远的一个版本。官方用如下层级关系定义了新的心智模型Howler (global) - Howl (group) - Sound (single)Howler全局管理所有声音提供全局音量、静音、停止、卸载与编解码检测Howl分组对应一个音频资源如一个文件或一组 sprite可视为一个音轨组Sound单声play()创建的每一次播放实例可被单独控制暂停、音量、速率、seek 等。这一模型在源码中有直接对应全局控制器HowlerGlobal在 src/howler.core.js 中定义维护_howls数组、全局 ID 计数器、HTML5 Audio 对象池等分组控制器Howl在 src/howler.core.js 中定义负责解析选项、建立事件监听、触发加载而每次play()都会创建独立的Sound实例见 src/howler.core.js 中new Sound(self)的调用。CHANGELOG 特别强调Howl 方法调用可以作用于单个声音也可以作用于组内全部声音——这正是pause、stop、volume、fade、mute、loop、rate等方法在没有传入id时作用于整个组的设计来源。插件机制与模块化v2.0 同时引入了插件概念核心core保证 Web Audio 与 HTML5 Audio 的 100% 行为对齐是 howler.js 的立身之本Spatial 插件通过 Web Audio API 提供 3D 空间音频与立体声支持见 src/plugins/howler.spatial.js。从源码结构看package.json 的构建脚本发行版howler.js正是由howler.core.js与howler.spatial.js拼接压缩而成这也印证了核心 可选插件的模块化设计。三、v2.0 Breaking Changes 全解读与迁移指南CHANGELOG 明确列出了四项 Breaking Changes每一项都附带了官方迁移示例。这些变更对升级旧项目至关重要逐一说明如下。1.buffer改名为html5旧代码用buffer: true强制使用 HTML5 Audio 以支持流式播放v2.0 后必须使用html5// 旧写法v1.x new Howl({ buffer: true }); // 新写法v2.x new Howl({ src: [stream.mp3], html5: true });从语义上讲html5更准确地表达了强制走 HTML5 Audio 路径的含义。源码中该选项在 src/howler.core.js 处解析为self._html5并直接影响_webAudio的判定src/howler.core.js。2.urls改名为src旧代码通过urls数组指定音频文件v2.0 起统一为src语义与 HTML5 的source src对齐也支持直接传单个字符串// 旧写法 new Howl({ urls: [sound.mp3, sound.ogg] }); // 新写法 new Howl({ src: [sound.webm, sound.mp3] });src中的文件按偏好顺序排列howler.js 会自动选择当前浏览器支持的第一个编解码格式加载逻辑见 src/howler.core.js。3.pos改名为seek旧方法pos(position)用于设置播放位置v2.0 起更名seek单位同样是秒// 改变声音的播放位置单位秒。 sound.seek(10);CHANGELOG 中大量后续修复如seek 负数导致报错、未加载时调用 seek都与该 API 相关。4.mute与unmute合并为mutev1.x 有两个方法v2.0 统一为带布尔参数的单方法// 静音一个声音或全部声音。 sound.mute(true); Howler.mute(true); // 取消静音一个声音或全部声音。 sound.mute(false); Howler.mute(false);5.play不再接受回调改为直接返回 Sound ID这是 API 形态上最重要的变化——play是唯一不可链式调用的方法// 获取某次播放的 sound id。 var id sound.play(); // 暂停该次播放。 sound.pause(id);该设计配合多播放实例控制能力让同一个Howl可以同时播放多个重叠的Sound并单独控制。为避免 ID 冲突源码中全局计数器从 1000 起步src/howler.core.js这也是 2.0.4 中Sound ID 从 1000 开始而非 0以避免 rate 碰撞修复的延续。6. 移除fadeIn/fadeOut统一为fade旧方法被合并为单一fade(from, to, duration)// 淡入一个声音。 sound.fade(0, 1, 1000); // 在上一段淡入结束后淡出。 sound.once(fade, function(){ sound.fade(1, 0, 1000); });值得注意的是示例中使用了 v2.0 新增的once方法——事件回调执行一次后自动移除配合fade事件可以实现淡入-淡出的链式衔接。四、v2.0 新增能力事件体系与运行时控制CHANGELOG 中 v2.0 的New Features部分列出了大量新增 API这些构成了今天 howler.js 的核心用法。事件系统全面升级新增事件类型fade、stop、mute、volume、rate、seek。加上原有的load、loaderror、play、end、pause等v2.x 的事件列表与 README.md 中on(event, function, [id])的文档完全对应。on/once/off均支持第三个参数id从而可以只监听或移除某个特定 Sound 的事件。事件初始化与分发机制见 src/howler.core.js。新增查询方法方法作用playing([id])返回指定声音或组内任一声音是否正在播放duration([id])返回音频源时长秒传入 ID 时返回该实例 sprite 的时长state()返回 Howl 的加载状态unloaded/loading/loadedrate([rate], [id])运行时改变播放速率0.5 ~ 4.01.0 为正常速度Web Audio 与 HTML5 Audio 均生效state()与加载流程关联紧密加载中状态在 src/howler.core.js 被置为loading这一逻辑与 2.2.2 中缓冲期间状态改为 loading的变更CHANGELOG.md一脉相承。其他重要新增preload选项默认true自动预加载设为false时需手动调用load()。源码在 src/howler.core.js 解析并在 src/howler.core.js 决定是否自动加载pool选项控制非活跃 Sound 的回收池大小默认 5用于性能优化全局unload卸载所有活跃 Howl 并重置 AudioContext 以释放内存实现见 src/howler.core.jsSprite 完整控制v2.0 起 sprite 播放可被精确控制此前存在 bug 或完全不工作sprite 定义格式为[offset, duration, (loop)]毫秒第三位可选表示该 sprite 是否循环once方法一次性事件监听格式支持扩展新增 Dolby Audio、.webm扩展名、CAFF 音频格式。事件与队列机制CHANGELOG 提到内部事件队列被用于修复加载前多次操作导致的竞态问题。从源码结构看src/howler.core.js 维护了_queue数组加载前发起的play等操作会进入队列等待这与 2.0.4 中加载前发起的任何播放都会进入队列以修复竞态条件的变更相互印证。五、模块化与 Spatial 插件3D 空间音频能力v2.0 起 spatial/stereo 能力从核心中剥离由 src/plugins/howler.spatial.js 提供。CHANGELOG 记录了该插件的能力清单全局Howler方法stereo、pos、orientation用于控制听者位置与朝向。分组Howl方法stereo、pos、orientation、pannerAttr控制单个声音或一组声音的立体声/空间音频参数。pannerAttr可调参数CHANGELOG 明确列出coneInnerAngle、coneOuterAngle、coneOuterGain、distanceModel、maxDistance、panningModel、refDistance、rolloffFactor。围绕该插件有一长串修复记录体现了空间音频在不同浏览器的兼容难点2.1.3 修复听者顶部 x/y/z 朝向未正确设置2.1.0 修复Safari 中应使用setPosition而非setOrientation2.0.14 修复无 sprite 时循环空间音频报错、Safari 空间朝向抛错问题2.0.13 修复使用空间音频后 Sound 未正确重置2.0.5 修复pannerAttr可按文档说明以对象形式传入。仓库中的 tests/spatial.html 与 tests/js/spatial.js 可用于验证这些空间音频行为而 examples/3d 目录提供了一个完整的 3D 第一人称音频游戏示例含sound.js、game.js等实现文件是理解pos/orientation实战用法的参考。六、v2.1HTML5 Audio 对象池与 autoUnlock 改名v2.1.02018 年 12 月引入了两个影响深远的设计。HTML5 Audio 对象池移动端浏览器要求每个 HTML5 Audio 对象都需单独解锁因此 howler.js 维护了一个全局的已解锁 Audio 节点池在首次用户交互时批量创建。新增全局选项html5PoolSize用于控制池大小源码中默认值为10src/howler.core.js池的填充逻辑在_unlockAudio内src/howler.core.js节点的取出与归还分别由_obtainHtml5Audiosrc/howler.core.js与_releaseHtml5Audiosrc/howler.core.js完成。CHANGELOG 同时给出了兼容性说明该池对 99% 的使用场景无感知若想绕过池可将html5PoolSize设为0。mobileAutoEnable更名为autoUnlock由于音频锁定已不再是移动端专属问题桌面 Chrome/Safari 同样需要用户交互解锁v2.1.0 将全局属性Howler.mobileAutoEnable更名为Howler.autoUnlock默认true。如果旧代码直接设置了Howler.mobileAutoEnable需迁移为Howler.autoUnlock。源码中该属性在 src/howler.core.js 初始化解锁流程监听touchstart、touchend、click、keydown四种事件src/howler.core.js2.2.2 新增的keydown监听即对应 CHANGELOG 中Include keydown event when unlocking audio的变更。七、v2.2xhr 自定义请求、全局 stop 与 preload 细化v2.2.02020 年 5 月集中补齐了网络层与全局控制能力。xhr属性自定义网络请求Web Audio 模式下音频文件通过 XHR 加载v2.2.0 允许通过新的xhr选项自定义请求官方示例// 使用全部属性。 new Howl({ xhr: { method: POST, headers: { Authorization: Bearer: token, }, withCredentials: true, } }); // 仅修改请求方法。 new Howl({ xhr: { method: POST, } });各字段默认值method默认GET、headers默认null、withCredentials默认false。源码中该选项在 src/howler.core.js 解析为self._xhr并在实际加载时应用xhr.open(self._xhr.method, url, true)、xhr.withCredentials self._xhr.withCredentials、遍历self._xhr.headers设置请求头src/howler.core.js请求发送被包裹在safeXhrSend的 try/catch 中以优雅处理异常src/howler.core.js。Breaking Changes 提示v2.2.0 将旧的xhrWithCredentials属性并入xhr对象键名为withCredentials。Howler.stop()全局停止新增全局方法Howler.stop()一次调用停止所有声音。实现非常简洁——遍历全局_howls数组并逐个调用stop()src/howler.core.js。preload: metadatapreload选项除了布尔值还可传字符串metadata仅预加载元数据例如在不下载完整文件的情况下获取时长。这一能力对 HTML5 Audio 场景尤其有用源码中_preload的判定逻辑见 src/howler.core.js。其他新增与修复新增m4b音频格式支持修复 AudioContext 处于interrupted状态导致卡在suspending的问题修复极短fade时长下volume返回错误值修复jsdom-global环境下HowlerGlobal未定义的问题修复 Safari 中 AudioContext 无法解锁时的内存泄漏。2.2.32023 年 9 月作为 CHANGELOG 记录的最近一次版本更新修复了 Opera 100 版本号的正则误判涉及 src/howler.core.js 的 UA 解析逻辑、pannerAttr首次调用不生效以及已卸载声音刷新 buffer 时的报错。八、贯穿版本的修复主线那些反复出现的经典问题CHANGELOG 中占比最高的是FIXED条目它们集中反映了 Web 音频开发的几大痛点。移动端自动解锁贯穿 1.1.22 → 2.2.2iOS/Android 浏览器要求用户交互后才能播放音频。howler.js 从 1.1.22 起自动尝试解锁历经多次修正1.1.27 由touchstart改为touchend适配 iOS 9、1.1.28 修复 iOS 启用器 typo、2.0.5 支持滑动手势解锁、2.0.14 将解锁扩展到桌面 Chrome、2.1.0 因不再仅限移动端而更名autoUnlock、2.2.2 加入keydown事件。最终形态监听touchstart/touchend/click/keydown并播放 scratch buffer见 src/howler.core.js。循环播放可靠性1.0.11 → 2.1.3从非 sprite HTML5 音频片段无法播放1.0.11到Chrome 42 Web Audio 规范变更导致循环失效1.1.26、Firefox 桌面版循环不总是生效2.2.2、可能阻止循环的竞态条件2.1.3循环是修复次数最多的领域之一。v2.0 后end事件在 Web Audio 模式下每个循环结束都会正确触发。淡入淡出精度1.1.6 → 2.2.0fade方法自 1.1.6 引入后持续打磨1.1.6 消除全局静音 bug、2.0.1 改善短淡入淡出性能并正确处理 0→0 淡出、2.0.6 取消静音时同步取消 fade、2.0.8 改为基于经过时间的计算以应对不一致的定时器间隔、2.1.0 强制 fade 值为数字、2.2.1 修复可导致无限循环的 fade 边界情况。浏览器兼容专项Opera / Safari / IE / EdgeOpera2.2.3 修复 100 版本号正则误判Safari2.0.9 为 HTML5 播放 Promise 增加第二参数、2.2.1 适配 Safari 14 的 WAV 支持检测变化、2.2.2 在 Safari 14 修复前禁用 WebMIE/Edge2.0.15 修复 IE11 播放错误、2.1.0 修复InvalidStateError、2.1.2 在Audio不受支持时避免报错。九、v1.x 回顾现代 API 的雏形虽然 2.0 是全面重写但 CHANGELOG 显示 v1.x 已经奠定了大量今天仍在使用的 API 基础1.0.02013 年 1 月首个提交1.0.5全局静音同时作用于未来播放的声音1.0.8新增onplay事件、base64 音频播放支持1.0.12CORS 报错时自动回退 HTML5 Audio1.1.0新增pos3dWeb Audio 专属空间音频、多播放实例控制play回调返回soundId、sprite 循环定义[pos, duration, loop]1.1.1新增onloaderror事件与format属性覆盖 URL 扩展名提取1.1.5新增 Ogg Opus 支持、semver 标签1.1.6引入通用fade方法fadeIn/fadeOut被标记废弃1.1.10新增unload方法1.1.12新增rate属性当时仅 Web Audio 生效2.0 起两种模式均支持1.1.17CommonJS 支持Browserify 等、mp4 播放支持、暴露noAudio1.1.19CocoonJS 支持1.1.20panningModel 默认equalpower、3D 音频自动切换HRTF、可传model覆盖1.1.21npm 与 bower 支持对应今天的 package.json1.1.22新增全局codecs方法检测编解码支持1.1.25AudioContext暴露到全局Howler对象1.1.29loaderror事件携带错误信息、.off()不再以字符串比较函数。值得一提的还有 2.0.2 中的设计细节仅在第一个 Howl 建立后才创建 AudioContext以保证移动端后台音频行为符合预期——这条在 CHANGELOG 末尾的Bug Fixes中明确记录体现了对移动端资源消耗的刻意优化。十、从 CHANGELOG 反推 howler.js 的设计原则综观全部版本记录可以归纳出 howler.js 一以贯之的几条原则这些原则在今天阅读源码时依然适用Web Audio 优先、HTML5 Audio 兜底核心目标始终是两种模式 100% 行为对齐遇到 HTTPS 页面加载 HTTP 资源时还会自动降级到 HTML5 Audio 以避免 Mixed Content 错误src/howler.core.js无外部依赖、纯 JavaScriptREADME.md 与 package.jsondevDependencies 仅含 uglify-js 用于构建均可验证竞态条件零容忍从 v1.x 的队列机制到 2.0.4 将加载前播放入队、2.0.15 的 play lock 检查内部队列与锁机制贯穿始终移动端体验优先自动解锁、30 秒无播放自动挂起 AudioContextautoSuspend见 src/howler.core.js、后台音频行为优化均是 CHANGELOG 反复出现的主题性能与内存HTML5 Audio 对象池、Sound 回收池pool、unload重置 AudioContext构成了完整的资源管理闭环。延伸阅读核心实现src/howler.core.js全局/分组/Sound 三层模型、XHR 加载、音频解锁、自动挂起空间音频插件src/plugins/howler.spatial.js完整 API 文档README.md测试用例tests/core.webaudio.html、tests/core.html5audio.html、tests/spatial.html实战示例examples/player/index.html音频播放器、examples/radio/index.html电台、examples/sprite/index.html音效精灵、examples/3d3D 空间音频游戏版本与依赖package.json赞分享音视频前端【免费下载链接】howler.jsJavascript audio library for the modern web.项目地址https://gitcode.com/gh_mirrors/ho/howler.js点击查看免费下载相关推荐MMPose 版本演进全览从 v0.5.0 到 v1.3.2 的架构变迁、里程碑特性与 Breaking Changes 深度解读MMPose 版本演进全览从 v0.5.0 到 v1.3.2 的架构变迁、里程碑特性与 Breaking Changes 深度解读 MMPose 是 Open计算机视觉人工智能深度学习Gson 版本演进全解析从 1.0 到 2.10 的 CHANGELOG 深度解读Gson 版本演进全解析从 1.0 到 2.10 的 CHANGELOG 深度解读 Gson 是 Google 开源的 Java 序列化/反序列化库用于在后端FlutterBoost 版本演进全解析从 0.0.1 到 4.6.3 的架构变革、Breaking Changes 与多端适配之路FlutterBoost 版本演进全解析从 0.0.1 到 4.6.3 的架构变革、Breaking Changes 与多端适配之路 FlutterBoost上一篇Azul与Electron终极对比为什么Rust GUI框架是更好的桌面应用开发选择下一篇小狼毫输入法快捷键大全提升输入效率的实用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考