我有一个奇怪的问题。我正在使用网络音频播放来自服务器的流。我通过以下方式做到这一点:
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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)