使用Web Audio api播放非常慢

时间:2015-01-14 03:43:52

标签: web-audio

我有一个非常奇怪的问题:

我正在通过以下方式播放带有网络音频API的wav:

        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 7更改为Windows 8.1。 这个问题可能有任何关系吗?

我在Chrome和Firefox中尝试过,两者都有相同的行为。

感谢您的帮助!

修改

我正在向客户端发送浮点值,因为我在this thread中了解到,Web Audio Api需要介于-1和1之间的浮点值才能正确处理音频数据。 当我删除浮动值并再次开始发送PCM数据时,播放速度是正常的。它又充满了噪音,但速度很正常......

我真的很感激任何可以帮助我找出这个奇怪问题的输入。

2 个答案:

答案 0 :(得分:1)

检查AudioContext的采样率,并将其替换为硬编码的44100值。另外,检查缓冲区的通道数。您的代码实际上只适用于单声道。

答案 1 :(得分:0)

我有同样的问题,在88200玩似乎解决了它。

但正如@padenot指出的那样,我试图将左右声道分开(假设我正在处理交错立体声):

var floatsLeft = new Float32Array(samples.length/2);
var floatsRight = new Float32Array(samples.length/2);

for (var i = samples.length - 1; i >= 0; i--) {
  if(i%2 == 0)
    floatsLeft[i/2] = samples[i];
  else
    floatsRight[(i-1)/2] = samples[i];
};

var audioBuffer = audioContext.createBuffer(2, samples.length/2, audioContext.sampleRate)
var bufferSource = audioContext.createBufferSource();

audioBuffer.getChannelData(0).set(floatsLeft);
audioBuffer.getChannelData(1).set(floatsRight);

bufferSource.buffer = audioBuffer;
bufferSource.connect(audioContext.destination);
bufferSource.start(0);

现在它完美无缺。也可能是立体声!