2 回答

TA贡献1155条经验 获得超0个赞
另一种可能更简单的方法是使用WaveShaperNode。我认为curve
等于 [-1, 0, 1] 会做你想做的事,将值钳制为 +/-1。如果您不过度采样,则不会有任何额外的延迟。
请注意,我很确定所有浏览器都会在向扬声器发送音频之前实现这种钳位。

TA贡献1831条经验 获得超4个赞
这对于任何内置的 AudioNode 都是不可能的。但这可以通过自定义 AudioWorklet 来实现。我最近发布了一个可以做到这一点的包。它被称为limiter-audio-worklet。
它导出两个函数:
import { addLimiterAudioWorkletModule, createLimiterAudioWorkletNode } from 'limiter-audio-worklet';
第一个函数可用于添加AudioWorklet特定的AudioContext.
await addLimiterAudioWorkletModule((url) => {
audioContext.audioWorklet.addModule(url);
});
AudioWorkletNode完成后,可以像这样创建实际的:
const limiterAudioWorkletNode = createLimiterAudioWorkletNode(
AudioWorkletNode,
audioContext,
{ attack: 0 }
);
如果您设置attack两个零,您将获得所需的效果。+1/-1 以上的所有内容都会被限制。如果你增加它,attack它会使用前瞻来平滑过渡。这将引入一个小的延迟(相同大小),但听起来要好得多。
当然,还需要将先前创建的limiterAudioWorkletNode靠近音频图的末尾连接起来。
yourLastAudioNode
.connect(limiterAudioWorkletNode)
.connect(audioContext.destination);
添加回答
举报