【问题标题】:Limited playback rate using the Web Audio API使用 Web Audio API 限制播放速率
【发布时间】:2021-07-24 14:36:27
【问题描述】:

我正在尝试使用 Web Audio API 创建一个简单的合成器,但我遇到了 AudioBuffer 的播放速率问题。当我尝试使用较高的值时,它的值似乎受到限制。

这是我的代码示例。我首先创建一个样本缓冲区,其中包含一个简单波形,该波形具有与采样率一样多的样本(如果直接读取,这将创建一个 1Hz 的波形)。然后我创建一个包含样本的AudioBuffer。最后,我创建了一个AudioBufferSourceNode,它将以某种播放速率(转换为可听频率)循环播放上一个缓冲区。

const audioContext = new window.AudioContext();

const buffer = new Float32Array(audioContext.sampleRate);
for (let i = 0; i < buffer.length; i++) {
    buffer[i] = Math.sin(2 * Math.PI * i / audioContext.sampleRate);
}

const audioBuffer = new AudioBuffer({
    length: buffer.length,
    numberOfChannels: 1,
    sampleRate: audioContext.sampleRate
});
audioBuffer.copyToChannel(buffer, 0);

const sourceNode = new AudioBufferSourceNode(audioContext, {
    buffer: audioBuffer,
    loop: true,
    playbackRate: 440
});
sourceNode.connect(audioContext.destination);

sourceNode.start();

在这种情况下,playbackRate 似乎受限于1024。任何高于此的值都不会产生任何声音效果。我验证了它的最大值 (sourceNode.playbackRate.maxValue),它在 3.4e+38 附近,远高于我想要达到的目标。

我想知道我是否遗漏了什么,或者我对这个 API 的理解是错误的。如果这有任何改变,我会在最新版本上使用 Google Chrome。

【问题讨论】:

    标签: javascript signal-processing web-audio-api


    【解决方案1】:

    这是 Chrome 中的一个错误:https://crbug.com/712256。我相信 Firefox 可能会正确实现这一点(但我没有检查)。

    另外请注意,Chrome 使用非常简单的插值。当playbackRate 与 1 相差很大时,输出的质量会下降很多。

    【讨论】:

      猜你喜欢
      • 2018-07-18
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      相关资源
      最近更新 更多