Javascript 将blob作为Uint8Array发送到NodeJS并将其保存到文件
我正在尝试将来自Firefox中新MediaRecorder API的blob发送到NodeJS,以将其存储在文件中。blob包含转换为webm文件的录制。 在发送之前,我将这个blob分块成一定大小,以便能够通过webrtc数据通道提供的带宽发送它。这个看起来像这样:Javascript 将blob作为Uint8Array发送到NodeJS并将其保存到文件,javascript,node.js,blob,html5-filesystem,web-mediarecorder,Javascript,Node.js,Blob,Html5 Filesystem,Web Mediarecorder,我正在尝试将来自Firefox中新MediaRecorder API的blob发送到NodeJS,以将其存储在文件中。blob包含转换为webm文件的录制。 在发送之前,我将这个blob分块成一定大小,以便能够通过webrtc数据通道提供的带宽发送它。这个看起来像这样: var blobToBuffer = function(blob, cb) { var reader = new FileReader(); reader.onload = function() { cb(rea
var blobToBuffer = function(blob, cb) {
var reader = new FileReader();
reader.onload = function() {
cb(reader.result);
};
reader.readAsArrayBuffer(blob);
};
blobToBuffer(blob, function(buffer){
var sendInterval = setInterval(function(){
var currentEnd = dataSend + dis._dataChunkSize;
if(currentEnd > buffer.byteLength){
currentEnd = buffer.byteLength;
}
var part = Array.apply([], new Uint8Array(buffer.slice(dataSend, currentEnd)));
dis.dataChannel.send(
JSON.stringify({
payload: part
})
);
dataSend = currentEnd;
if(dataSend + 1 >= buffer.byteLength){
dis.dataChannel.send(JSON.stringify({action: 'dataEnd'}));
clearInterval(sendInterval);
}
}, 1000);
});
在nodeJS方面,我尝试将数据转换回webm文件,如下所示:
fs.appendFile('my/path/file.webm', new Buffer(new Uint8Array(message.payload)), function(error){
if(error){
console.log(error);
} else {
console.log('Chunk successfully written');
}
});
它告诉我,区块已写入,但文件为空。我用从blob派生的base64编码字符串尝试了同样的方法,这是可行的,但由于可能的数据损坏,这似乎是个坏主意
我错过了什么?还是有更好的方法将blob从JavaScript传输到NodeJS
编辑
uint8array构造函数似乎不接受以字符串形式输入的数据:
'0':39,'1':209,'2':79,'3':0,'4':230,'5':133,‘6’:190、‘7’:138、‘8’:188、‘9’:103、‘10’:131、 在新的Uint8Array(message.payload)部分之后,数组长度仍然是0。那么,应该怎么做呢 编辑II 在使用JSON.stringify()时添加了.toString()之后,我按照希望的方式接收了UInt8Array。但是,正如上面显示的代码,它只将[object uint8array]写入文件 编辑III-解决方案
使用上面的代码可以很好地工作。