问题描述
非常类似于this question-我正在尝试从一个客户端向另一个客户端发送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}
您有两个选择:
-
将数组转换为
stringify
之前的标准数字数组,然后将其转换为JSON.parse
之后的数字,或者 -
按原样发送并将
Float32Array
之后的结果对象转换回JSON.parse
。
由于将Float32Array
转换为数字数组不会造成损失,并且可以很好地保持语义,这就是我要做的:
const original = Float32Array.of(20,444);
const json = JSON.stringify(Array.from(original));
console.log(json);
const received = new Float32Array(JSON.parse(json));
console.log(received);
如果此数组是更大结构的一部分,则可能需要replacer function,其中JSON.stringify
,reviver
function代表JSON.parse
。