我正在尝试使用WebRTC创建一个文件共享站点。
我的测试环境:
铬金丝雀 42.0.2275.0苹果 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数据通道来执行此操作。
我尝试了这个SO答案的建议 通过RTC数据通道发送图像数据 没有运气。它表明,如果我省略 RtpDataChannels: true
选项,data.send() 将被限制为 64KB/s,而不是 3KB/s(由我的测试确认),这就是 RTP 被限制到的。
关于如何通过数据通道以超过 3KB/s 的速度发送更大的文件的任何想法?
您正在发送(据我所知)每 500 毫秒发送一个块。 我认为,这就是你的主要限制所在。
在 Firefox 中,你可以为每个块调用 .send(),没有(或最小)延迟。他们会尽快排队并出去。 请注意,这确实需要内存,尽管将数据保存在剩余的DataURL中也会占用内存。
更高级的方法可以监控缓冲数据的数量,如果 Chrome 不允许您一次发送所有数据(它应该......