我试图将来自Firefox中的新MediaRecorder API的blob发送到NodeJS以将其存储在文件中。该blob包含转换后的webm文件的记录。 在发送之前,我将这个blob分成一定的大小,以便能够通过webrtc数据通道提供的带宽发送它。这看起来是这样的:将blob作为Uint8Array发送到NodeJS并将其保存到文件
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编码的字符串,它工作,但似乎是一个坏主意,因为可能的数据损坏。
我错过了什么?或者有没有更好的方法将JavaScript从blob转移到NodeJS?
EDIT
的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。应该怎么做呢?
EDIT II
添加的ToString()之后透过JSON.stringify()时我设法接收UInt8Array如所愿。但是,现在代码如上所示,它只将[object uint8array]写入文件中。
编辑III - 解决方案
使用上面的代码工作正常。
非常感谢。我实际上已经开始工作了(见上文)。使用toString()是一种天真的问题。我想知道哪一个表现更好。 –
感谢大家:我在JSPerf上创建了一个测试。 http://jsperf.com/filereader-reading-blob-and-stringify/2 - 注意您的浏览器控制台的说明。要点:使用ArrayBuffer并在NodeJS上处理它 –