到达WebRTC.io和NodeJS时连接到一个房间

我实际上正在研究一个基于NodeJS,WS,WebRTC.io和socket.io的应用程序。 这个应用程序的目的是将主持人的video广播给多个与会者。

主持人和所有与会者加载Web应用程序,然后主持人启动他的video并将其传送给所有与会者。 对于这种情况,我没有任何问题,但是如果主持人启动他的video,那么与会者join会议室,此与会者无法检索到stream,而我也不知道如何获取此stream。

我尝试了很多解决scheme。

第一个scheme

当一个与会者到达房间时,他通过socket.io发送一条消息给发送他的stream的主机。 问题在于stream以对象的forms到达与会者,而不是MediaStream,因此我无法使用它。

第二解决scheme

当一个与会者到达房间时,他通过socket.io发送一个消息给主机,该主机用window.webkitURL.createObjectURL(rtc.streams[0])发送一个blob,然后我使用这个blob作为video源与会者,但我获得了一个404错误。

这里是两个解决scheme的代码:

 var isStreamCreated = false; function startVideoLive() { var video = document.getElementById('video'); //Test if peer connection is available for the browser if (PeerConnection) { if (getRole() == 1) { rtc.createStream({ "video": true, "audio": true }, function (stream) { video.src = URL.createObjectURL(stream); video.play(); isStreamCreated = true }); } } if (isConnected != true) { var room = '1234'; rtc.connect('ws://' + server + ':8443', room); isConnected = true; } } function setAttendeeWebRTC() { if (getRole() == 0) { var message = { type: "getStreamInfos", URL: null, stream: null } socket.emit('message', message); rtc.on('add remote stream', function (stream, socketId) { rtc.attachStream(stream, 'video'); isStreamCreated = true; }); } } startVideoLive(); setAttendeeWebRTC(); function onGetStreamInfos(message) { if (getRole() == 1 && isStreamCreated == true) { message.URL = window.webkitURL.createObjectURL(rtc.streams[0]); message.stream = rtc.streams[0]; socket.emit('message', message); } else if (getRole() == 0 && isStreamCreated == false && message.URL != null && message.stream != null) { document.getElementById('video').src = message.URL; // OR rtc.attachStream(message.stream, 'video') isStreamCreated = true; } } 

getRole()用于知道连接的用户是参与者(0)还是主机(1)。

在服务器端,我只是广播websocket消息,并添加webrtc.io(和许多其他的东西,但在这种情况下不是有用的)。

这是2个案例的错误:

  • 使用blob:GET BLOB:http%3A // 128.1.222.159%3A8081 / 881928b6-70d3-4054-b15e-88d635a2125f 404(未find)

  • 与stream:未捕获TypeError:types错误
    rtc.attachStream
    onGetStreamInfos
    (匿名function)
    EventEmitter.emit socket.io.js? = 1375350434038:633
    SocketNamespace.onPacket socket.io.js? = 1375350434038:2248
    Socket.onPacket socket.io.js? = 1375350434038:1930
    Transport.onPacket socket.io.js? = 1375350434038:1332
    Transport.onData socket.io.js?_ = 1375350434038:1303
    WS.open.websocket.onmessage

如果有人对我如何处理我的问题有什么想法,我会提前感谢。

编辑1:

我发现如何解决我的问题,但有一个新的问题。 这是我的部分解决scheme:

 function onGetStreamInfos(message) { if (getRole() == 1 && isStreamCreated == true) { rtc.createPeerConnections(); rtc.addStreams(); rtc.addDataChannels(); rtc.sendOffers() } else if (getRole() == 0 && isStreamCreated == false) { isStreamCreated = true; } } 

但现在,当与会者join会议室时,其他与会者丢失了video。 我认为这是因为通常我不应该在新的参与者和旧参与者之间build立对等连接。

我不确定是否清楚,但如果您需要更多的信息,请不要犹豫,如果我终于find了解决问题的办法,我会在这里给出解决scheme。

编辑2:

通过删除rtc.createPeerConnections();rtc.addDataChannels(); 它似乎在大多数情况下工作(我没有testing这么多的情况下)。

如果我正确理解你的问题,它看起来像你试图通过Socket.io消息交换video数据,而这需要通过RTCPeerConnection完成。

无耻的自我推销,但你可能想看看我写的WebRTC codelab,它使用Socket.io的信号。

对于less数与会者,您可以使用多个RTCPeerConnection。 (看看Talky , Tawk , FACEmeeting或Browser Meeting等应用程序。)

对于更多与会者,您将需要使用MCU (有可用的开源实现),或者推出您自己的服务器端WebRTC应用程序。 在今年的Google I / O展示中,有更多关于WebRTC架构的信息: video , 幻灯片 。

你为什么要做rtc.addDataChannels(); 数据通道是为了传输数据(而不是媒体)而创build的,对于只需使用RTCPeerConnection的媒体,通过信令通道发送sdp和ice候选对象。 如果一切顺利,你将有一个媒体stream。

数据通道在发送媒体stream中没有任何作用,而是用于对等数据(游戏,文件等)

如果您不想经过设置您自己的信令服务器的麻烦,可以使用Pubnub或Pusher来为您处理。 他们是实时数据平台,但也可以用来做webRTC信号。

如果你有兴趣尝试一下,这里有一个使用Pusher的webRTC信令教程 。

http://pusher.com/tutorials/webrtc_chat

免责声明:我在Pusher工作。