javascript - 为什么我的 JS 音频流代码在 x86 和 x86_64 系统上听起来不同?

标签 javascript binary streaming web-audio-api endianness

我的应用程序将 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 机器时,音频充满了听起来像重采样/位转换的伪影。

我读了很多关于字节序的文章,但是两台机器都是 Pentium,所以都应该是小字节序,对吗?那么这怎么可能呢?

最佳答案

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

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

相关文章:

c++ - 将 Big-Endian 结构转换为 Little-Endian C++

c# - 字节到底是什么,它与二进制有什么关系?

java - 使用 -libjars 的 MapReduce 流作业,自定义分区程序失败 : "class not found"

php - Zend_Http_Client - 从 Stream 读取?

javascript - 单击它后更改div css

javascript - Three.js 在它自己的轴上旋转

javascript - d3 "De-Selecting"节点不正确

c++ - 以二进制格式读取类

使用视频 View 的 Android 视频流(视频 View 不会自动显示)

java - 在 Java 中获取防火墙后客户端的实际 IP 地址