我正在尝试将来自 Firefox 中新 MediaRecorder API 的 blob 发送到 NodeJS 以将其存储在文件中。该 blob 包含作为转换后的 webm 文件的记录。
我在发送之前将这个 blob 分块成一定大小,以便能够通过 webrtc 数据 channel 提供的带宽发送它。这看起来像这样:

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 编码字符串进行了相同的尝试,该字符串有效,但由于可能的数据损坏,这似乎是一个坏主意。

我错过了什么?或者有没有更好的方法将 blob 从 JavaScript 传输到 NodeJS?

编辑

uint8array 构造函数似乎不接受作为字符串传入的数据:



在new Uint8Array(message.payload)部分之后,数组长度仍然是0,那么应该怎么做呢?

编辑 II

在使用 JSON.stringify() 时添加 .toString() 后,我设法根据需要接收了 UInt8Array。然而,正如上面显示的代码,它只将 [object uint8array] 写入文件。

编辑 III - 解决方案

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

最佳答案

[object uint8array] 是在 toString 上使用 uint8array 时应该得到的。只需将缓冲区转换为字符串并发送该字符串。如果您愿意,可以尝试使用 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 阻止某些传输协议(protocol)误解原始二进制字符串的原因。
dis.dataChannel.send(
  JSON.stringify({
    payload: btoa(str)   // encode string as base64;
  })
);

还要确保 MIME 类型正确。

关于javascript - 将 blob 作为 Uint8Array 发送到 NodeJS 并将其保存到文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33318773/

10-10 21:44