В API Web Audio есть способ установить максимальную громкость? - PullRequest
0 голосов
/ 17 апреля 2020

Я знаю, что вы можете увеличить или уменьшить громкость с усилением. Мне было интересно, есть ли способ (возможно, через узел) ограничить максимальную громкость на выходе - не уменьшая звук ниже этого максимального значения. Это допустимо, если есть искажения для звука, который ограничен следующим образом.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Альтернативой, которая может быть проще, является использование WaveShaperNode . Я думаю, что curve, равный [-1, 0, 1], будет делать то, что вы хотите, ограничивая значения до +/- 1. Если вы не сделаете передискретизацию, дополнительной задержки не будет.

Обратите внимание, что я уверен, что все браузеры реализуют этот тип фиксации перед отправкой звука на динамики.

0 голосов
/ 17 апреля 2020

Это невозможно с любым из встроенных AudioNodes. Но это может быть достигнуто с помощью пользовательского 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...