跳转到内容

Stretcher

WSOLA(波形相似性重叠相加)时间拉伸引擎,在不影响音高的情况下改变播放速度。使用 Web Worker 进行实时音频处理。

import { createStretcherEngine } from "waa-play/stretcher";

createStretcherEngine()

createStretcherEngine(
ctx: AudioContext,
buffer: AudioBuffer,
options: StretcherOptions,
): StretcherEngine;

为给定缓冲区创建 WSOLA 时间拉伸引擎。

const engine = createStretcherEngine(ctx, buffer, {
tempo: 0.75,
loop: true,
});
engine.start();

StretcherOptions

interface StretcherOptions {
tempo?: number;
offset?: number;
loop?: boolean;
through?: AudioNode[];
destination?: AudioNode;
timeupdateInterval?: number;
workerPoolSize?: number;
}
选项类型默认值说明
temponumber1时间拉伸比率(0.5 = 半速,2 = 倍速)
offsetnumber0起始位置(秒)
loopbooleanfalse循环播放
throughAudioNode[][]经由的音频节点
destinationAudioNodectx.destination输出目标
timeupdateIntervalnumber250进度事件间隔(ms)
workerPoolSizenumber-WSOLA 工作线程数

StretcherEngine 方法

播放控制

start(): void;
pause(): void;
resume(): void;
seek(position: number): void;
stop(): void;

配置

setTempo(tempo: number): void;

在播放过程中改变时间拉伸比率。

engine.setTempo(1.5); // Speed up to 1.5x

状态

getCurrentPosition(): number;
getStatus(): StretcherStatus;
getSnapshot(): PlaybackSnapshot;

事件

on(event: string, handler: Function): () => void;
off(event: string, handler: Function): void;

清理

dispose(): void;

停止播放,终止工作线程,释放所有资源。

事件

事件说明
progress位置更新
bufferhealth缓冲健康状态改变
buffering工作线程缓冲欠载,音频可能卡顿
buffered从欠载中恢复
chunkready新的块处理完成
complete所有块处理完成
ended播放到达末尾
error工作线程发生错误

StretcherStatus

interface StretcherStatus {
phase: string;
conversion: { ... };
buffer: { ... };
playback: { ... };
}

包含引擎内部状态信息的详细状态对象,包括转换进度、缓冲健康状况和播放位置。

通过 play() 使用

使用拉伸器最简单的方式是在 play() 函数中指定 preservePitch: true

import { play } from "waa-play/play";
const playback = play(ctx, buffer, {
playbackRate: 0.75,
preservePitch: true,
});
// Change speed while preserving pitch
playback.setPlaybackRate(1.5);