使用网络音频限制播放速率 API
Limited playback rate using the Web Audio API
我正在尝试使用网络音频 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。
这是 Chrome 中的错误:https://crbug.com/712256。我相信 Firefox 可能会正确实现这一点(但我没有检查)。
另请注意,Chrome 使用非常简单的插值。当 playbackRate
与 1.
有很大不同时,输出质量会下降很多
我正在尝试使用网络音频 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。
这是 Chrome 中的错误:https://crbug.com/712256。我相信 Firefox 可能会正确实现这一点(但我没有检查)。
另请注意,Chrome 使用非常简单的插值。当 playbackRate
与 1.