在使用 Web Audio Api 播放的 Stream 中单击声音

met*_*lic 5 javascript web-audio-api

我有一个奇怪的问题。我正在使用网络音频播放来自服务器的流。我这样做:

 var d2 = new DataView(evt.data);

var data = new Float32Array(d2.byteLength / Float32Array.BYTES_PER_ELEMENT);
for (var jj = 0; jj < data.length; ++jj) {
    data[jj] = d2.getFloat32(jj * Float32Array.BYTES_PER_ELEMENT, true);
}

var buffer = context.createBuffer(1, data.length, 44100);
buffer.getChannelData(0).set(data);

source = context.createBufferSource();
source.buffer = buffer;
source.start(startTime);
source.connect(context.destination);

startTime += buffer.duration;
Run Code Online (Sandbox Code Playgroud)

这工作正常。如果我在我的电脑上播放流,我没有任何问题。

如果我在 Windows 8 平板电脑(相同的 Chrome 版本)上播放相同的流,我的音频中有很多点击声。一秒钟内有多个。在每个缓冲区的末尾我听到咔哒声有点接缝。

我不明白其中的区别……我能找到的唯一区别是我电脑上声卡的采样率是 44100,而在平板电脑上是 48000。

传输的流在 44100 中,我没有任何采样率问题。只是咔哒声。

有人知道为什么会这样吗?

谢谢,新陈代谢

pad*_*not 2

AudioBufferSourceNode 将其缓冲区重新采样为 AudioContext 采样率。正如您可以想象的那样,API 不允许您保持一个 AudioBufferSourceNode 与另一个 AudioBufferSourceNode 之间的重采样器状态,因此两个缓冲区之间存在不连续性。

我认为最简单的方法是通过在服务器端重新采样来以设备的采样率提供流。当 AudioWorkerNode 准备好并实现时,您将能够自己以及客户端修复此问题,但事实并非如此。

或者,您也可以仅使用元素进行流式传输,并使用 AudioContext.createMediaElementSource() 将其通过管道传送到 Web Audio API。