我有一个奇怪的问题。我正在使用Web Audio从服务器播放流。我这样做的方式如下:
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,我没有任何采样率问题。只是点击声音。
有人知道为什么会这样吗?
谢谢你, 代谢
答案 0 :(得分:1)
AudioBufferSourceNode将其缓冲区重新采样为AudioContext采样率。可以想象,API不允许您在一个AudioBufferSourceNode与另一个之间保持重采样器状态,因此两个缓冲区之间存在不连续性。
我认为最简单的方法是通过重新采样服务器端以设备的采样率提供流。当AudioWorkerNode准备好并实现时,您将能够自己解决这个问题以及客户端,但事实并非如此。
另外,您也可以使用元素流式传输,并使用AudioContext.createMediaElementSource()将其传递给Web Audio API。
答案 1 :(得分:0)
由于Padenot的回答,我检查了采样率,所以我遇到了同样的问题。 AudioContext.sampleRate默认为44100,但是PCM数据和AudioBuffer为48000。使用匹配的sampleRate初始化AudioContext解决了问题:
var AudioContext = window.AudioContext || window.webkitAudioContext;
var audioCtx = new AudioContext({
latencyHint: 'interactive',
sampleRate: 48000,
});
有了这个,我可以连续播放20ms 48khz PCM16 AudioBuffers的节目,而不会造成任何点击或失真。