我正在尝试学习如何创建RTCPeerConnection
,以便我可以使用DataChannel
API。以下是我从我理解的内容中尝试过的内容:
var client = new mozRTCPeerConnection;
var server = new mozRTCPeerConnection;
client.createOffer(function (description) {
client.setLocalDescription(description);
server.setRemoteDescription(description);
server.createAnswer(function (description) {
server.setLocalDescription(description);
client.setRemoteDescription(description);
var clientChannel = client.createDataChannel("chat");
var serverChannel = server.createDataChannel("chat");
clientChannel.onmessage = serverChannel.onmessage = onmessage;
clientChannel.send("Hello Server!");
serverChannel.send("Hello Client!");
function onmessage(event) {
alert(event.data);
}
});
});
我不确定出了什么问题,但我假设连接永远不会建立,因为没有显示任何消息。
我在哪里可以了解更多相关信息?我已经阅读了Getting Started with WebRTC - HTML5 Rocks教程。
答案 0 :(得分:13)
我在筛选了很多文章后终于开始工作了:http://jsfiddle.net/LcQzV/
首先我们创建对等连接:
var media = {};
media.fake = media.audio = true;
var client = new mozRTCPeerConnection;
var server = new mozRTCPeerConnection;
当客户端连接到服务器时,它必须打开一个数据通道:
client.onconnection = function () {
var channel = client.createDataChannel("chat", {});
channel.onmessage = function (event) {
alert("Server: " + event.data);
};
channel.onopen = function () {
channel.send("Hello Server!");
};
};
当客户端创建数据通道时,服务器可能会响应:
server.ondatachannel = function (channel) {
channel.onmessage = function (event) {
alert("Client: " + event.data);
};
channel.onopen = function () {
channel.send("Hello Client!");
};
};
我们需要向客户端和服务器添加假音频流以建立连接:
navigator.mozGetUserMedia(media, callback, errback);
function callback(fakeAudio) {
server.addStream(fakeAudio);
client.addStream(fakeAudio);
client.createOffer(offer);
}
function errback(error) {
alert(error);
}
客户创建优惠:
function offer(description) {
client.setLocalDescription(description, function () {
server.setRemoteDescription(description, function () {
server.createAnswer(answer);
});
});
}
服务器接受要约并建立连接:
function answer(description) {
server.setLocalDescription(description, function () {
client.setRemoteDescription(description, function () {
var port1 = Date.now();
var port2 = port1 + 1;
client.connectDataConnection(port1, port2);
server.connectDataConnection(port2, port1);
});
});
}
呼。这需要一段时间才能理解。
答案 1 :(得分:4)
我posted a gist显示设置数据连接,与兼容 Chrome和Firefox兼容。
主要区别在于,在FF中你需要等到设置连接,在Chrome中它恰恰相反:在发送任何优惠之前,您似乎需要创建数据连接前/后:
var pc1 = new RTCPeerConnection(cfg, con);
if (!pc1.connectDataConnection) setupDC1(); // Chrome...Firefox defers per other answer
另一个区别是Chrome将事件对象传递给.ondatachannel
,而FF只传递原始频道:
pc2.ondatachannel = function (e) {
var datachannel = e.channel || e;
请注意,您目前需要Chrome {每晚启动--enable-data-channels
才能使用它。
答案 2 :(得分:4)
以下是我今天(2014年2月)在Chrome中发布的一系列事件。这是针对简化的情况,其中对等体1将视频流式传输到对等体2。
addIceCandidate
SetRemoteDescription
用它,然后回答&发送它SetRemoteDescription
随身携带getUserMedia
调用)getUserMedia
成功,我们就有了一个流。在对等方1的对等连接对象上调用addStream
。我还没有找到在第9步之后添加视频的方法。当我想要改变某些内容时,我会回到第3步。