我有一个非常奇怪的问题:
我正在通过以下方式播放带有网络音频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数据时,播放速度是正常的。它又充满了噪音,但速度很正常......
我真的很感激任何可以帮助我找出这个奇怪问题的输入。
答案 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);
现在它完美无缺。也可能是立体声!