用Web Audio Api播放的流中的点击声音。

问题描述 投票:3回答:2

我有一个奇怪的问题。我使用网络音频来播放服务器上的流。我用下面的方法来做。

 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和我没有任何采样率的问题,只是点击的声音。

有人知道为什么会发生这种情况吗?

谢谢你,新陈代谢

javascript web-audio-api
2个回答
2
投票

AudioBufferSourceNode将它们的缓冲区重新采样到AudioContext采样器中。正如你可以想象的那样,API不允许你在一个AudioBufferSourceNode和另一个AudioBufferSourceNode之间保持重采样的状态,所以两个缓冲区之间有一个不连续性。

我认为最简单的方法是通过服务器端重采样,以设备的采样率提供一个流。当AudioWorkerNode准备好并实现后,你就可以自己在客户端解决这个问题,但这不是。

另外,你也可以使用一个元素流,然后使用AudioContext.createMediaElementSource()将其导入Web Audio API。


0
投票

我也有同样的问题,感谢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背靠背,没有任何点击或失真。

© www.soinside.com 2019 - 2024. All rights reserved.