【问题标题】:Creating DataChannel that sends data over SCTP instead of RTP创建通过 SCTP 而不是 RTP 发送数据的 DataChannel
【发布时间】:2015-01-14 01:17:43
【问题描述】:

我正在尝试使用 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 答案 Send image data over RTC Data Channel 上的建议,但没有运气。它表明,如果我省略 RtpDataChannels: true 选项,data.send() 将被限制为 64KB/s,而不是 RTP 被限制为 3KB/s(由我的测试确认)。

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

【问题讨论】:

  • 你检查过 sharefest.me 和 peerjs 代码吗?我的理解是他们已经这样做了,而且他们的代码是开源的,是在许可许可下提供的。
  • @AlexGouaillard sharefest 目前似乎不起作用
  • 有可能,我很久没看他们的代码了。他们是数据通道的先驱,尤其是在带宽基准方面。我认为他们进行了另一个更高级别的项目:peer5.com
  • 仅供参考,RTPDataChannels 已在 Chrome 中被禁用

标签: webrtc rtcdatachannel


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2012-10-03
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2023-03-19
    • 2018-06-10
    相关资源
    最近更新 更多