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)

但理论上,您应该能够以偏移感知的方式覆盖每个方法。

祝你好运!