Howler.js 变量偏移量
Howler.js variable offset
为了方便起见,我从网络音频 API 过渡到 Howler.js,但是我不知道如何在声音开始时实现可变(静音)偏移。
这是一个例子:
设snd
为简单的嚎叫声,offset
为可变数:
let snd = new Howl({ src: data })
let offset = 2000 // in ms
我想做一些类似的事情:
snd.seek(1000)
这不会在声音中寻找 1 秒,而是在开始偏移的一半。
此外,如果 snd
正在播放,我需要能够执行以下操作:
offset = 4000
并且在播放过程中音频将进一步移动 2 秒(4000 毫秒 - 2000 毫秒)。
显然,这个例子过于简单了,偏移量的分配将在一个函数中与一堆其他逻辑。话虽这么说,有什么办法可以用 Howler.js 实现这一点,即使有点 hacky?
我见过带有定时器和 setTimeout
的选项,但这些选项似乎不准确或不符合我的逻辑要求。我也尝试过 seek()
的负值,但这些似乎默认为 0
.
Howl 似乎不支持此功能,但您可以包装一个 howl 实例并自己添加此逻辑。您可以创建一个新的 class,它继承自 Howl
,并包含此逻辑。
而且这不会是微不足道的。
这个例子非常不完整,但它说明了一种可能有效的方法。你基本上想要重载你的 subclass 中的每个方法并让它知道偏移量。
import { Howl, HowlOptions } from 'howler'
interface HowlWithOffsetOptions extends HowlOptions {
offset: number
}
class HowlWithOffset extends Howl {
#offset: number = 0
constructor(options: HowlWithOffsetOptions) {
super(options)
this.#offset = options.offset
}
offset(newOffset?: number): number {
if (newOffset) {
this.#offset = newOffset
}
return this.#offset
}
// start playing in `offset` milliseconds.
play() {
setTimeout(() => super.play(), this.#offset)
}
seek(position?: number): number {
if (position != null) {
if (position > this.#offset) {
super.seek(this.#offset - position)
} else {
super.seek(0)
}
}
}
}
同样,这些实现并不完整。您需要处理寻求小于偏移量的值的情况,您可能需要跟踪您是在偏移部分还是实际声音部分。如果您支持在播放时更改偏移量,则可能需要在更改偏移量时调用 seek(newPosition)
。
但理论上,您应该能够以偏移感知的方式覆盖每个方法。
祝你好运!
为了方便起见,我从网络音频 API 过渡到 Howler.js,但是我不知道如何在声音开始时实现可变(静音)偏移。
这是一个例子:
设snd
为简单的嚎叫声,offset
为可变数:
let snd = new Howl({ src: data })
let offset = 2000 // in ms
我想做一些类似的事情:
snd.seek(1000)
这不会在声音中寻找 1 秒,而是在开始偏移的一半。
此外,如果 snd
正在播放,我需要能够执行以下操作:
offset = 4000
并且在播放过程中音频将进一步移动 2 秒(4000 毫秒 - 2000 毫秒)。
显然,这个例子过于简单了,偏移量的分配将在一个函数中与一堆其他逻辑。话虽这么说,有什么办法可以用 Howler.js 实现这一点,即使有点 hacky?
我见过带有定时器和 setTimeout
的选项,但这些选项似乎不准确或不符合我的逻辑要求。我也尝试过 seek()
的负值,但这些似乎默认为 0
.
Howl 似乎不支持此功能,但您可以包装一个 howl 实例并自己添加此逻辑。您可以创建一个新的 class,它继承自 Howl
,并包含此逻辑。
而且这不会是微不足道的。
这个例子非常不完整,但它说明了一种可能有效的方法。你基本上想要重载你的 subclass 中的每个方法并让它知道偏移量。
import { Howl, HowlOptions } from 'howler'
interface HowlWithOffsetOptions extends HowlOptions {
offset: number
}
class HowlWithOffset extends Howl {
#offset: number = 0
constructor(options: HowlWithOffsetOptions) {
super(options)
this.#offset = options.offset
}
offset(newOffset?: number): number {
if (newOffset) {
this.#offset = newOffset
}
return this.#offset
}
// start playing in `offset` milliseconds.
play() {
setTimeout(() => super.play(), this.#offset)
}
seek(position?: number): number {
if (position != null) {
if (position > this.#offset) {
super.seek(this.#offset - position)
} else {
super.seek(0)
}
}
}
}
同样,这些实现并不完整。您需要处理寻求小于偏移量的值的情况,您可能需要跟踪您是在偏移部分还是实际声音部分。如果您支持在播放时更改偏移量,则可能需要在更改偏移量时调用 seek(newPosition)
。
但理论上,您应该能够以偏移感知的方式覆盖每个方法。
祝你好运!