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);
添加回答
舉報