为了账号安全,请及时绑定邮箱和手机立即绑定

在 Web Audio API 中,有没有办法设置最大音量?

在 Web Audio API 中,有没有办法设置最大音量?

慕田峪4524236 2022-07-01 16:08:30
我知道您可以通过增益来提高或降低音量。我想知道是否有办法(可能通过节点)来限制输出的最大音量 - 不会减少低于该最大值的任何音频。如果像这样被封顶的音频有失真是可以接受的。
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

另一种可能更简单的方法是使用WaveShaperNode。我认为curve等于 [-1, 0, 1] 会做你想做的事,将值钳制为 +/-1。如果您不过度采样,则不会有任何额外的延迟。

请注意,我很确定所有浏览器都会在向扬声器发送音频之前实现这种钳位。


查看完整回答
反对 回复 2022-07-01
?
慕容708150

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);


查看完整回答
反对 回复 2022-07-01
  • 2 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号