创建通过 SCTP 而不是 RTP 发送数据的数据通道



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

我的测试环境:

铬金丝雀 42.0.2275.0苹果 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);时,这有效。但是,这对于文件共享Web应用程序来说太慢了,我想使用WebRTC数据通道来执行此操作。

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

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

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

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

更高级的方法可以监控缓冲数据的数量,如果 Chrome 不允许您一次发送所有数据(它应该......

最新更新