掌握 wavesurfer.js Envelope 插件:可视化实现淡入淡出与音量包络控制
【免费下载链接】wavesurfer.jsAudio waveform player项目地址: https://gitcode.com/gh_mirrors/wa/wavesurfer.js
wavesurfer.js 是一款轻量、高性能的开源音频波形播放器,而它的Envelope(包络)插件是其中非常实用的"隐藏技能":通过在波形上画一条可拖拽的控制线,你就能直观地实现淡入淡出、分段音量调节,完全不需要理解复杂的声音处理数学。本文面向新手,用最短的篇幅带你掌握 Envelope 插件的全部用法 🎚️
一、Envelope 插件能做什么?
Envelope 插件在波形图上叠加一条 SVG 折线(音量包络线),每个控制点代表"某个时刻、某个音量"(时间 0~时长,音量 0~1)。播放器在播放时会实时插值计算当前音量并自动应用到音频上。
典型应用场景:
- 🎬 播客/有声书开头 3 秒淡入、结尾 2 秒淡出
- 🎧 长音频中临时压低某一段音量(比如静音广告)
- 🎵 用代码精确编排整段音频的音量曲线
- 📱 触屏设备上长按加点、拖点编辑包络
插件源码见 src/plugins/envelope.ts,官方示例见 examples/envelope.js。
二、效果长什么样:包络线与控制点
上图来自项目的 Cypress 视觉回归测试:红色半透明折线就是音量包络,青色圆点是控制点。线越高音量越大,线越低音量越小。
三、快速上手:三步启用 Envelope 插件
第 1 步:获取源码
git clone https://gitcode.com/gh_mirrors/wa/wavesurfer.js第 2 步:注册插件
创建播放器时传入插件即可,核心配置项一目了然:
const envelope = wavesurfer.registerPlugin( EnvelopePlugin.create({ volume: 0.8, // 初始音量 lineColor: 'rgba(255, 0, 0, 0.5)', // 包络线颜色 points: [ { time: 11.2, volume: 0.5 }, // 11.2秒处音量 50% { time: 15.5, volume: 0.8 }, // 15.5秒处音量 80% ], }), )第 3 步:开始编辑
- 桌面端:在波形上双击即可新增控制点
- 触屏端:长按 500ms新增控制点(见 envelope.ts 中的触屏处理)
四、交互操作一览:鼠标和手指这样用
| 操作 | 效果 | 备注 |
|---|---|---|
| 双击波形(桌面) | 新增控制点 | 触点位置即时间与音量 |
| 长按 500ms(触屏) | 新增控制点 | 移动手指会自动取消 |
| 拖动控制点 | 调整该点的时间与音量 | 不能越过相邻点 |
| 把控制点拖出画布 | 删除该点 | 拖出约半个点大小即生效 |
| 上下拖动整条线 | 所有点同步移动 | 需设置dragLine: true |
下面这张图演示了通过addPoint方法新增一个控制点后的效果(来自 envelope.cy.js 测试):
💡 小技巧:
dragLine开启后,整条线会变成"上下平移"模式,适合整体抬升或压低音量,就像推子一样顺滑。
五、常用配置项速查表
默认值定义在 defaultOptions,都可以按需覆盖:
| 配置项 | 默认值 | 说明 |
|---|---|---|
points | [] | 初始控制点数组,格式{ time, volume } |
volume | 跟随播放器 | 初始音量,0~1(大于 1 会放大音量) |
lineColor | rgba(0,0,255,0.5) | 包络线颜色 |
lineWidth | 4 | 包络线宽度 |
dragLine | false | 是否允许上下拖动整条线 |
dragPointSize | 10 | 控制点尺寸,移动端建议调大到 20 |
dragPointFill | rgba(255,255,255,0.8) | 控制点填充色 |
dragPointStroke | rgba(255,255,255,0.8) | 控制点描边色 |
六、API 方法与事件:代码控制包络
核心方法(完整定义见 EnvelopePlugin 类):
| 方法 | 作用 |
|---|---|
addPoint({ time, volume }) | 新增一个控制点,自动按时间排序 |
removePoint(point) | 删除指定控制点 |
getPoints() | 获取当前所有控制点 |
setPoints(newPoints) | 一次性替换整条包络(批量编辑很高效) |
setVolume(0~1)/getCurrentVolume() | 设置 / 读取当前包络音量 |
destroy() | 销毁插件并清理 DOM |
两个关键事件:
points-change:控制点集合变化时触发(拖拽过程做了 200ms 节流,避免高频刷新)volume-change:播放中音量被包络改变时触发,适合驱动 UI 上的音量数字
官方示例中还演示了"随机生成一批点"的玩法,参考 examples/envelope.js。
七、音量是如何计算的?(30 秒看懂原理)
播放到任意时刻,插件会找到前后两个相邻控制点,对音量做线性插值:
- 找到当前时间前后的控制点(没有就用"起点 0 音量 0"和"终点 0 音量 0"兜底)
- 按比例算出当前音量,并限制在 0~1 之间
- 四舍五入到 0.01,若有变化就更新播放器音量
核心逻辑见 onTimeUpdate 方法。
八、实战:经典淡入淡出配置
想让音频"3 秒淡入、最后 2 秒淡出",只需 4 个点(假设总时长 30 秒):
points: [ { time: 0, volume: 0 }, // 静音开始 → 淡入 { time: 3, volume: 1 }, // 3秒恢复最大音量 { time: 28, volume: 1 }, // 28秒开始淡出 { time: 30, volume: 0 }, // 静音结束 ]常见"踩坑"提醒⚠️:
- 不配置任何点时,音频会全程静音——因为插值的兜底点音量都是 0,记得至少放一条"全程满音量"的线
- 控制点不能拖过相邻点,想删除请直接把点拖出画布
- 想在移动端更好地拖动,把
dragPointSize调大(示例中移动端设为 20) - 包络音量是在播放器主音量基础上再乘一次,两者是叠加关系
九、总结
wavesurfer.js 的 Envelope 插件用"一条线 + 几个点"的极简交互,解决了音频编辑中最常用的淡入淡出与分段音量控制需求:
- ✅ 双击/长按加点,拖拽调点,零学习成本
- ✅ 可视化编辑,所见即所得
- ✅ 少量配置项 + 清晰的事件,方便集成到复杂业务
更多插件(Regions 区域标记、Zoom 缩放等)都在 src/plugins/ 目录下,配合使用可以让你的音频应用功能更强大。快去试试吧!🚀
【免费下载链接】wavesurfer.jsAudio waveform player项目地址: https://gitcode.com/gh_mirrors/wa/wavesurfer.js
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考