3

我正在尝试使用 WebRTC 创建文件共享站点。

我的测试环境:

Chrome 金丝雀 42.0.2275.0 Mac 10.10 (14A389)

代码:

var arrayToStoreChunks = [];
channel.onmessage = function(data){
  // console.log(data.data);
  var data = data.data;

  arrayToStoreChunks.push(data.message); // pushing chunks in array

  if (data.last) {
    downloadURI(arrayToStoreChunks.join(''), 'some.jpg');
    arrayToStoreChunks = []; // resetting array
  }
};

var button = document.getElementById('button');
var fileElement = document.getElementById('files');
button.onclick = function(){
  var reader = new FileReader()
  reader.readAsDataURL(fileElement.files[0])
  reader.onload = onReadAsDataURL;
};

function downloadURI(uri, name) {
  var link = document.createElement("a");
  link.download = name;
  link.href = uri;
  link.click();
}

var chunkLength = 1000;
function onReadAsDataURL(event, text) {
  var data = {}; // data object to transmit over data channel

  if (event) {
    text = event.target.result;
  }

  if (text.length > chunkLength) {
    data.message = text.slice(0, chunkLength);
  } else {
    data.message = text;
    data.last = true;
  }

  channel.send(data);

  var remainingDataURL = text.slice(data.message.length);
  if (remainingDataURL.length) {
    setTimeout(function () {
      onReadAsDataURL(null, remainingDataURL); // continue transmitting
    }, 500);
  }
}

我正在分块数据并以我指定的任何延迟发送每条消息的任何大小。当我拥有var optionalRtpDataChannels = {optional: [{'RtpDataChannels': true}]};并将该对象传递给new RTCPeerConnection(servers, optionalRtpDataChannels);. 但是,这对于文件共享网络应用程序来说太慢了,我想使用 WebRTC DataChannels 来做到这一点。

我尝试了这个 SO 答案中的建议通过 RTC 数据通道发送图像数据,但没有运气。它表明,如果我忽略RtpDataChannels: truedata.send() 将被限制为 64KB/s 而不是 3KB/s(由我的测试确认)的选项,这是 RTP 被限制的选项。

关于如何以超过 3KB/s 的速度通过 DataChannel 发送更大文件的任何想法?

4

1 回答 1

1

您每 500 毫秒发送(据我所知)一个块。我认为这就是你的主要限制。

在 Firefox 中,您可以为每个块调用 .send() ,而没有(或最小)延迟。他们将排队并尽快出去。请注意,这确实会占用内存,尽管将数据保存在 remainingDataURL 也会占用内存。

更高级的方法可以监控缓冲数据的数量,如果 Chrome 不允许您一次发送所有数据,这可能会避免出现问题(它应该......)

于 2015-01-20T16:57:25.883 回答