为了方便起见,我从Web过渡到了Howler.js,但是我不知道如何在声音的开头实现一个变量(沉默)偏移量。
下面是一个例子:
让snd是一个简单的嚎叫声,offset是一个可变的数字:
let snd = new Howl({ src: data })
let offset = 2000 // in ms我希望能够做到以下几点:
snd.seek(1000)而这将不会寻求1秒的声音,而是在一半的开始偏移。
此外,如果snd正在播放,我需要能够执行以下操作:
offset = 4000在回放过程中,音频将进一步移动2秒(4000 be 2000 Be)。
显然,这个例子过于简化了,偏移量的分配将在一个函数中与其他一些逻辑一起进行。话虽如此,有什么方法可以用Howler.js来实现这一点,即使有点麻烦呢?
我见过计时器和setTimeout的选项,但这些选项要么不准确,要么不符合我的逻辑要求。我也尝试过seek()的负值,但这些值似乎默认为0。
发布于 2020-08-26 21:14:21
Howl似乎不支持这一点,但是您可以包装howl的实例并自己添加这个逻辑。您可以创建一个从Howl继承的新类,其中包含此逻辑。
而且这不会是微不足道的。
这个例子非常不完整,但它说明了一种可能有效的方法。基本上,您需要重载子类中的每个方法,并使其具有偏移感知。
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)。
但从理论上讲,您应该能够以偏移感知的方式覆盖每个方法。
祝好运!
https://stackoverflow.com/questions/63604766
复制相似问题