Создание DataChannel, который отправляет данные по SCTP вместо RTP

Я пытаюсь создать сайт обмена файлами с помощью 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);, Тем не менее, это слишком медленно для веб-приложения для обмена файлами, и я хотел бы использовать WebRTC DataChannels для этого.

Я попробовал то, что было предложено в этом SO ответе. Отправка данных изображения по каналу RTC без удачи. Это говорит о том, что если я пропущу RtpDataChannels: true Опция, что data.send() будет регулироваться до 64 КБ / с, а не 3 КБ / с (подтверждено моими испытаниями), что и делает RTP.

Любые идеи о том, как я могу отправить большие файлы через канал данных быстрее, чем 3 КБ / с?

1 ответ

Вы отправляете (насколько я могу судить) один кусок за 500 мс. Вот где ваше основное ограничение, я думаю.

В Firefox вы можете просто вызывать.send() для каждого чанка без (или минимальной) задержки. Они будут стоять в очереди и выходить как можно быстрее. Обратите внимание, что для этого требуется память, хотя для хранения данных в Остальном DataURL также потребуется память.

Более сложные методы могут отслеживать объем буферизованных данных, что может избежать проблем, если Chrome не позволит вам отправить все данные сразу (это должно...)

Другие вопросы по тегам