【问题标题】:Different volume levels do not work while using Web Audio API使用 Web Audio API 时不同的音量级别不起作用
【发布时间】:2020-11-16 04:26:10
【问题描述】:
public useAudio(base64EncodedAudio: any, loop: boolean, volume: number) {
    let _this = this;
    let audioFromString = this.base64ToBuffer(base64EncodedAudio);
    this._context.decodeAudioData(audioFromString, function (buffer) {
        _this.audioBuffer = buffer;
        _this.PlaySound(loop, volume);
    }, function (error) {
        TelemetryClient.error(EventType.BASE64_DECODE_ERROR, "Error decoding sound string");
    });

}

private PlaySound(loop: boolean, volume: number) {
    this._source = this._context.createBufferSource();

    let gainNode = this._context.createGain();
    gainNode.gain.value = +(volume / 100).toFixed(2);
    gainNode.connect(this._context.destination);

    this._source.buffer = this._audioBuffer;
    this._source.loop = loop;
    this._source.connect(gainNode);
    this._source.start(0);
}

gainNode.gain.value 似乎无法正常工作。值 1 和 0.15 以最大音量播放声音。

我这里有什么遗漏吗?

【问题讨论】:

  • 请告知我们您用于进行此测试的 MS Edge 浏览器的确切版本?我同意@chrisguttandin 的建议。您是否尝试在任何其他机器上运行此代码来检查结果?如果没有,您可以进行检查并让我们知道结果可能有助于缩小问题范围。
  • 不知道是否相关,但您将字符串设置为值。

标签: google-chrome microsoft-edge html5-audio web-audio-api


【解决方案1】:

gain AudioParam 可以处理非常大的值,但如果你想降低音量,它的值必须介于 0 和 1 之间。当值为 0 时,将听不到声音,而值为 1 实际上会绕过GainNode。任何较大的值都会放大声音。但取决于浏览器和操作系统,您可能听不到,因为在声音到达您的扬声器之前可能有一个限制器。

【讨论】:

  • 对于问题中的错误细节,我深表歉意。值 1 和 0.15 似乎没有产生任何差异。因此,我说音量无法正常工作。你能告诉我我做错了什么吗?
  • 不用担心。但不幸的是,在这种情况下,我不知道一个简单的解决方法。我会做一些不同的事情,你的代码至少有一个错误(_this.audioBuffer vs this._audioBuffer)。但GainNode 似乎没有任何问题。
  • 我强烈建议在某处创建一个演示问题的 sn-p。这样,它是一个很好的独立示例,人们可以通过它来查看发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多