在 JSON.stringify 之后发送并转换 Float32Array

Sending and casting a Float32Array after JSON.stringify

非常相似 - 我正在尝试从一个客户端向另一个客户端发送 Float32Array,但我需要在发送消息之前使用 JSON.stringify

在发送端我使用:

audioBuffer = e.inputBuffer.getChannelData(0)
var aud = { "sessionId": sessionId, "streamData": audioBuffer, "client": "student", "type": "audio" }
ws.send(JSON.stringify(aud));

我在接收端使用:

var msg = JSON.parse(message.data);
var streamData = msg.streamData;
var kbuff = new Float32Array(streamData);
context.decodeAudioData(kbuff, onBuffer, onDecodeBufferError);

但这导致接收方得到一个 Object,我似乎无法将其转换为 Float32Array:

发送端发送数据时:

接收方获取数据时:

知道如何进行这项工作吗?

JSON不明白Float32Array。如果将 Float32Array 字符串化(例如,JSON.stringify(Float32Array.of(20, 250, 444))),您会得到如下所示的内容:

{"0":20,"1":250,"2":444}

您有两个选择:

  1. stringify之前将数组转换为标准数字数组,然后在JSON.parse之后将其转换回来,或者

  2. 发送 as-is 并在 JSON.parse.

    之后将生成的对象转换回 Float32Array

由于将 Float32Array 转换为数字数组不会有损,并且能很好地保持语义,这就是我要做的:

const original = Float32Array.of(20, 250, 444);
const json = JSON.stringify(Array.from(original));
console.log(json);
const received = new Float32Array(JSON.parse(json));
console.log(received);

如果此数组是更大结构的一部分,您可能需要 replacer function with JSON.stringify and reviver function 来表示 JSON.parse