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

时间:2015-01-14 01:17:43

标签: webrtc rtcdatachannel

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

我的测试环境:

Chrome Canary 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);时,这就有效。但是,对于文件共享Web应用程序来说这太慢了,我想使用WebRTC DataChannel来执行此操作。

我尝试了这个SO答案Send image data over RTC Data Channel的建议而没有运气。它建议如果我省略RtpDataChannels: true选项,data.send()将被限制为64KB / s而不是3KB / s(由我的测试确认),这是RTP被限制的。

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

1 个答案:

答案 0 :(得分:1)

你每500毫秒发送一个(最好我能说的)一个块。我认为这是你主要限制的地方。

在firefox中,你可以为每个没有(或最小)延迟的块调用.send()。他们将排队并尽快离开。请注意,这确实需要内存,但保留remainingDataURL中的数据也会占用内存。

Fancier方法可以监控缓冲数据的数量,如果Chrome不能让您一次发送所有数据(它应该......),这可能会避免问题。