4

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 - ソリューション

上記のコードを使用すると問題なく動作します。

4

1 に答える 1