首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Howler.js可变偏移量

Howler.js可变偏移量
EN

Stack Overflow用户
提问于 2020-08-26 19:47:03
回答 1查看 453关注 0票数 0

为了方便起见,我从Web过渡到了Howler.js,但是我不知道如何在声音的开头实现一个变量(沉默)偏移量。

下面是一个例子:

snd是一个简单的嚎叫声,offset是一个可变的数字:

代码语言:javascript
复制
let snd = new Howl({ src: data })
let offset = 2000 // in ms

我希望能够做到以下几点:

代码语言:javascript
复制
snd.seek(1000)

而这将不会寻求1秒的声音,而是在一半的开始偏移。

此外,如果snd正在播放,我需要能够执行以下操作:

代码语言:javascript
复制
offset = 4000

在回放过程中,音频将进一步移动2秒(4000 be 2000 Be)。

显然,这个例子过于简化了,偏移量的分配将在一个函数中与其他一些逻辑一起进行。话虽如此,有什么方法可以用Howler.js来实现这一点,即使有点麻烦呢?

我见过计时器和setTimeout的选项,但这些选项要么不准确,要么不符合我的逻辑要求。我也尝试过seek()的负值,但这些值似乎默认为0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-26 21:14:21

Howl似乎不支持这一点,但是您可以包装howl的实例并自己添加这个逻辑。您可以创建一个从Howl继承的新类,其中包含此逻辑。

而且这不会是微不足道的。

这个例子非常不完整,但它说明了一种可能有效的方法。基本上,您需要重载子类中的每个方法,并使其具有偏移感知。

代码语言:javascript
复制
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)

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

祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63604766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档