簡體   English   中英

在Web Audio API中,有沒有辦法設置最大音量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM