我正在尝试使用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的速度发送更大文件的任何想法?
答案 0 :(得分:1)
你每500毫秒发送一个(最好我能说的)一个块。我认为这是你主要限制的地方。
在firefox中,你可以为每个没有(或最小)延迟的块调用.send()。他们将排队并尽快离开。请注意,这确实需要内存,但保留remainingDataURL中的数据也会占用内存。
Fancier方法可以监控缓冲数据的数量,如果Chrome不能让您一次发送所有数据(它应该......),这可能会避免问题。