【发布时间】: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