我是WebRTC的新手。我正在构建一个应用程序,使用户能够查看彼此的视频流,以及交换文件。音频/视频部分已实现并正常工作。问题是我需要添加现在交换文件的能力。我使用以下代码初始化PeerConnection对象
var connection = _getConnection(partnerId);
console.log("Initiate offer")
// Add our audio/video stream
connection.addStream(stream);
// Send an offer for a connection
connection.createOffer(function (desc) { _createOfferSuccess(connection, partnerId, desc) }, function (error) { console.log('Error creating session description: ' + error); });
_getConnection使用
创建一个新的RTCPeerConnection对象
var connection = new RTCPeerConnection(iceconfig);
即没有明确的约束。它还初始化了它上面的不同事件处理程序。在此之后,我将音频/视频流附加到此连接。我还使用合作伙伴ID缓存这些连接,以便稍后使用。
问题是,我以后可以从缓存中调用连接对象,使用类似
之类的内容向其添加数据通道
connection.createDataChannel("DataChannel", dataChannelOptions);
并使用它来共享文件,还是我必须创建一个新的RTCPeerConnection对象并将数据通道附加到它?
答案 0 :(得分:-1)
您当然不必单独为文件传输创建另一个PeerConnection。现有的PeerConnection可以使用RTCDatachannel,其行为类似于传统的websocket机制(即没有中央服务器的双向通信)
`var PC = new RTCPeerConnection();
//specifying options for my datachannel
var dataChannelOptions = {
ordered: false, // unguaranted sequence
maxRetransmitTime: 2000, // 2000 miliseconds is the maximum time to try and retrsanmit failed messages
maxRetransmits : 5 // 5 is the number of times to try to retransmit failed messages , other options are negotiated , id , protocol
};
// createing data channel using RTC datachannel API name DC1
var dataChannel = PC.createDataChannel("DC1", dataChannelOptions);
dataChannel.onerror = function (error) {
console.log("DC Error:", error);
};
dataChannel.onmessage = function (event) {
console.log("DC Message:", event.data);
};
dataChannel.onopen = function () {
dataChannel.send(" Sending 123 "); // you can add file here in either strings/blob/array bufers almost anyways
};
dataChannel.onclose = function () {
console.log("DC is Closed");
};
`
PS:在通过datachannel API发送文件时,建议事先将文件分解为小块。我建议块大小差不多10 - 15 KB。