我有以下情况。我通过带有context.getImageData().data
的画布捕获网络摄像头帧。当我[r, g, b, a, r, g, b, a, r, g, b, a, etc.]
时,这给了我一个很好的数组(或UInt8ClampedArray说Bidelman)像console.log()
这样的整数。现在我想通过binaryjs将它发送到node.js服务器,当然数据得到了像地狱一样的混乱:https://gist.github.com/thgie/6550638
如何首先将数组转换为二进制文件,或者如何将二进制文件转换回可读数组?
代码示例
客户端:
client.send(ctx.getImageData(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT).data, {'id': 'bin', 'frame': frame});
服务器:
client.on('stream', function(stream, meta){
var bufs = [];
stream.on('data', function(data){
bufs.push(data);
});
stream.on('end', function(){
var buf = Buffer.concat(bufs);
fs.writeFile(__dirname + "/tmp/"+meta.frame+".dat", buf, "binary", function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
});
}
看起来像这样:
H>DÿNDJÿL@FÿPCJÿR@KÿQ?IÿLDPÿKCOÿMCKÿLAIÿL@DÿL@DÿLBGÿKAFÿIAHÿLDLÿLAIÿLAIÿO@IÿO@IÿIAJÿJBKÿMCIÿNDJÿQEIÿQEIÿPGHÿOFGÿMIHÿMIHÿPDFÿNCEÿIBDÿLEHÿPDFÿPDFÿMHLÿLGKÿMHLÿNIMÿOGLÿNFKÿOEMÿPFNÿRFSÿPERÿPERÿPERÿRGOÿSHPÿSGMÿSGMÿRJRÿQIPÿQJNÿRKPÿRKPÿQJNÿSGMÿSGMÿOHJÿSLOÿQJLÿRKMÿSIJÿTKKÿQLPÿPJNÿSLQÿRKPÿSLQÿUMRÿSKSÿUMTÿVMWÿSKUÿUJUÿRGQÿUMTÿUMTÿSKUÿVMWÿSMTÿSMTÿQNVÿQNVÿSMVÿTNWÿZMVÿXKTÿUJUÿVKVÿTOSÿTOSÿWQUÿWQUÿYTVÿYTVÿXRVÿUPTÿYSZÿYSZÿXRVÿZUYÿWPRÿYRTÿWRQÿXSRÿVOOÿWPPÿXRVÿXRVÿZOYÿ[P[ÿZO[ÿ\Q^ÿZT_ÿZT_ÿZV`ÿZV`ÿ]T^ÿ]T^ÿ^TZÿ`V[ÿ[VXÿ[VXÿ]UZÿ^V[ÿZV`ÿ[Waÿ_Xdÿ_Xdÿ]X`ÿ]X`ÿaZ_ÿaZ_ÿ_Y]ÿ`[_ÿ`Y]
答案 0 :(得分:1)
就浏览器方面而言,您可以使用chrome的开发工具轻松验证。查看二进制流量,它会告诉您是否发送文本帧的二进制文件。它们是websocket规范中不同类型的帧。
在节点端,您可以使用Buffer.isBuffer()
验证缓冲区值是否为真正的节点缓冲区。我看到你正在使用“二进制”字符串编码编写缓冲区。这可能不是你想要的。在节点中,本机Buffer
实例的编码为null
。 "binary"
,"ascii"
,"utf8"
,"hex"
,"base64"
编码都是字符串编码/解码。二进制编码的含义是每个字节都作为8位unicode代码点存储在字符串中。
// Convert a binary buffer into a "binary" encoded string.
function binaryEncode(buffer) {
var string = "";
for (var i = 0, l = buffer.length; i < l; i++) {
string += String.fromCharCode(buffer[i]);
}
return string
}
// Convert a "binary" encoded string into a binary buffer.
function binaryDecode(string) {
var length = string.length;
var buffer = new Buffer(length);
for (var i = 0; i < length; i++) {
buffer[i] = string.charCodeAt(i);
}
}
因此,可以在JavaScript字符串(其定义为每个字符具有16位unicode代码点)中非常安全地存储二进制数据。这不是最有效的事情,因为你浪费了每个字符的高8位,这就是为什么node.js更喜欢原生的Buffers。但是在浏览器加密库之类的东西中,这种“二进制”字符串编码很常见,因为它在所有JS平台上都受支持。