我有一个奇怪的问题。我使用网络音频来播放服务器上的流。我用下面的方法来做。
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;
如果我在电脑上播放流媒体,我没有任何问题。
如果我在我的Windows 8平板电脑上播放相同的流媒体(相同的Chrome版本),我的音频中有很多点击声。在一秒钟内有多个.它有点像是在每个缓冲区的末端我听到一个点击。
我不明白其中的区别...... 我唯一能找到的区别是,我电脑上声卡的采样率是44100,而平板电脑上是48000。
传输的流是在44100和我没有任何采样率的问题,只是点击的声音。
有人知道为什么会发生这种情况吗?
谢谢你,新陈代谢
AudioBufferSourceNode将它们的缓冲区重新采样到AudioContext采样器中。正如你可以想象的那样,API不允许你在一个AudioBufferSourceNode和另一个AudioBufferSourceNode之间保持重采样的状态,所以两个缓冲区之间有一个不连续性。
我认为最简单的方法是通过服务器端重采样,以设备的采样率提供一个流。当AudioWorkerNode准备好并实现后,你就可以自己在客户端解决这个问题,但这不是。
另外,你也可以使用一个元素流,然后使用AudioContext.createMediaElementSource()将其导入Web Audio API。
我也有同样的问题,感谢Padenot的回答,我检查了采样率。AudioContext.sampleRate默认为44100,但PCM数据和AudioBuffer是48000。 初始化的AudioContext有一个匹配的 采样率 解决了这个问题。
var AudioContext = window.AudioContext || window.webkitAudioContext;
var audioCtx = new AudioContext({
latencyHint: 'interactive',
sampleRate: 48000,
});
有了这个,我可以安排播放20ms 48khz PCM16 AudioBuffers背靠背,没有任何点击或失真。