pixi-sound.js 如何实现音频跳转至指定播放时间点的技术问题
pixi-sound 实现音频播放位置跳转的解决方案
核心操作逻辑
pixi-sound 已经内置了专门的跳转接口,不需要手动修改内部的currentTime、progress这类属性——这类值大多是内部实时计算的只读派生状态,直接赋值不会触发放音节点的重建逻辑,自然达不到跳转效果。
正确的跳转方式是直接调用声音实例上的seek()方法,传入目标位置的秒数即可:
// 推荐通过官方API获取声音实例,而非直接读取内部_sounds字典,避免依赖版本迭代的内部结构 const track = PIXI.sound.find('track01'); // 跳转到音频第1分30秒(即90秒)的位置 track.seek(90); // 不传参数时,seek会返回当前的播放位置(单位:秒) const currentPos = track.seek;
为什么之前的操作不生效
你之前接触到的几个currentTime值本质完全不同,没法用来触发跳转:
sound.media.context.audioContext.currentTime是AudioContext全局的累计运行时钟,从音频上下文初始化启动后就持续递增,和单个音轨的播放进度没有绑定关系,修改这个值不会影响任何单个音频的播放位置。- 声音实例上挂载的
currentTime、progress是pixi-sound 内部根据播放节点的启动时间动态计算出来的展示值,没有设置监听赋值的逻辑,直接修改不会触发实际播放流程的调整。 - 对于走WebAudio解码模式的音频,pixi-sound 内部的实际播放节点(BufferSource)是动态创建、销毁的,跳转操作本质是停止当前运行的播放节点,再从目标位置重新创建新的播放节点,这套逻辑全部封装在
seek()方法内部,手动改属性根本触发不了这套流程。
常见使用注意事项
seek()方法的参数单位为秒,传入值需要控制在音频总时长范围内,总时长可通过soundInstance.duration属性读取。- 如果音频还处于加载、解码阶段,直接调用seek会失效,需要等待音频加载完成后再执行操作,可通过监听实例的
load事件保证时机正确:track.on('load', () => { track.seek(90); }) - 如果跳转前音频处于暂停状态,执行seek后音频会保持原有暂停状态,需要手动调用
track.play()触发继续播放。
内容的提问来源于stack exchange,提问作者Oroonoko
相关产品推荐
相关产品推荐

