我的应用程序将PCM二进制数据从服务器流式传输到Web Audio API。

为了规范音频,我使用DataView将传入的数据转换为Int16,将每个样本除以32768,然后再将其转换回Float32进行播放:

var data = new DataView(arrayBuffer);

var tempArray = new Int16Array(data.byteLength / Int16Array.BYTES_PER_ELEMENT);

var len = tempArray.length;
for (var jj = 0; jj < len; ++jj) {
    tempArray[jj] = data.getInt16(jj * Int16Array.BYTES_PER_ELEMENT, true);
}


var bufferToPlay = new Float32Array(tempArray.length);
var channelCounter = 0;
for (var i = 0; i < tempArray.length;) {
    var normalizedAudio = tempArray[i] / 32768;
    i = i + 1;
    bufferToPlay[channelCounter] = normalizedAudio;
    channelCounter++;
}


这是怪异的:

当我在64位Win机器上运行此程序时,音频是完美无缺的。但是,当我使用旧的32位Win XP机器时,音频充满了听起来像重采样/位转换伪像的声音。

我已经读了很多有关字节序的文章,但是两台机器都是奔腾处理器,所以都应该是低字节序的,对吗?那怎么可能呢?

最佳答案

在每台计算机上,在sampleRate上检查WebAudio上下文。他们是一样的吗?另外,如果字节序错误,听起来就不会像重新采样/位转换一样。如果听起来像是重新采样,则两台机器的采样率很可能不同。

关于javascript - 为什么我的JS音频流代码在x86和x86_64系统上听起来不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38916220/

10-16 04:56