2015-10-24 70 views
3

我試圖將來自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 - 解決方案

使用上面的代碼工作正常。

回答

1

[object uint8array]是您在uint8array上使用toString時應該得到的結果。只需將緩衝區轉換爲字符串併發送字符串即可。如果你想要你可以嘗試base64編碼,但我不認爲你應該需要它。

var str = ""; // string version of the part 
for{var i = 0; i < part.length; i++){ 
    str += String.fromCharCode(part[i]); 
} 
dis.dataChannel.send(
    JSON.stringify({ 
    payload: str 
    }) 
); 

如果Nodejs不喜歡字符串,那麼使用btoa將其轉換爲base64編碼。不要擔心你不會受到腐敗,這就是base64阻止某些傳輸協議誤解原始二進制字符串的原因。

dis.dataChannel.send(
    JSON.stringify({ 
    payload: btoa(str) // encode string as base64; 
    }) 
); 

還要確保mime類型是正確的。

+0

非常感謝。我實際上已經開始工作了(見上文)。使用toString()是一種天真的問題。我想知道哪一個表現更好。 –

+0

感謝大家:我在JSPerf上創建了一個測試。 http://jsperf.com/filereader-reading-blob-and-stringify/2 - 注意您的瀏覽器控制檯的說明。要點:使用ArrayBuffer並在NodeJS上處理它 –

相關問題