[英]In the Web Audio API, is there a way to set a maximum volume?
我知道您可以通過增益來提高或降低音量。 我想知道是否有辦法(可能通過節點)來限制 output 的最大音量 - 不會減少低於該最大值的任何音頻。 如果像這樣被封頂的音頻存在失真,這是可以接受的。
另一種可能更簡單的方法是使用WaveShaperNode 。 我認為等於 [-1, 0, 1] 的curve
可以滿足您的要求,將值鉗制為 +/-1。 如果您不過度采樣,則不會有任何額外的延遲。
請注意,我很確定所有瀏覽器都會在向揚聲器發送音頻之前實現這種鉗位。
這對於任何內置的 AudioNode 都是不可能的。 但這可以通過自定義 AudioWorklet 來實現。 我最近發布了一個 package 正是這樣做的。 它被稱為limiter-audio-worklet 。
它導出兩個函數:
import { addLimiterAudioWorkletModule, createLimiterAudioWorkletNode } from 'limiter-audio-worklet';
第一個 function 可用於將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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.