我試圖將來自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上處理它 –