Firefox の新しい MediaRecorder API からのブロブを NodeJS に送信してファイルに保存しようとしています。BLOB には、変換された webm ファイルとして記録が含まれています。webrtc データチャネルによって提供される帯域幅を介して送信できるように、送信する前に、このブロブを特定のサイズにチャンクしています。これは次のようになります。
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');
}
});
チャンクが書き込まれたことがわかりますが、ファイルは空です。ブロブから派生したbase64でエンコードされた文字列で同じことを試みましたが、データが破損する可能性があるため、悪い考えのように思えました。
私は何が欠けていますか?または、ブロブを JavaScript から NodeJS に転送するより良い方法はありますか?
編集
uint8array-constructor は、入ってくるデータを文字列として受け入れないようです:
'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 です。代わりにどのように行う必要がありますか?
編集Ⅱ
JSON.stringify() を使用するときに .toString() を追加した後、希望どおりに UInt8Array を受け取ることができました。ただし、コードが上に示されているように、[object uint8array] のみがファイルに書き込まれます。
編集 III - ソリューション
上記のコードを使用すると問題なく動作します。