Создание 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 не позволит вам отправить все данные сразу (это должно...)