WebRTC / Socket.io连接两个客户端/信令

时间:2015-03-22 15:50:28

标签: webrtc

我用完整的信令交换更新了我的代码。现在的问题是,在完成交换后,“socket.on('receivedAnswer')”会抛出错误。我正在我的本地机器上用两个浏览器选项卡测试所有这些,所以我假设我还不需要ICE来实现...

<html>
<head>
<link rel = 'stylesheet' type = 'text/css' href= 'css.css'>
<script src="node_modules/socket.io/node_modules/socket.io-client/socket.io.js"></script>
</head>
<body>
<div id='video_box'>
<video id= 'video' autoplay="true">
</video>
</div>
<div id='video_box2'>
<video id='video2' autoplay="true">
</video>
<div>
<script>
    var local_stream;
    var baseURL = getBaseURL();
    var socketIOPort = 8999;
    var socketIOLocation = baseURL + socketIOPort;
    var socket = io(socketIOLocation);
    var localvid = document.getElementById('video');
    var mediaOptions = { audio: false, video: true };
    var pc = new mozRTCPeerConnection( {"iceServers": [{"url": "stun:stun.1.google.com:19302" }] });
    var pc2 = new mozRTCPeerConnection();
    var PeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
    var SessionDescription = window.RTCSessionDescription || window.mozRTCSessionDescription || window.webkitRTCSessionDescription;
    var offerConstraints = {OfferToReceiveAudio: true, OfferToReceiveVideo: true }

    socket.on('receivedAnswer', function(answerSDP){
        pc.setRemoteDescription(new mozRTCSessionDescription(answerSDP), function(){
            alert('received the answer');
        }, error2);
    });

    socket.on('getPeer1', function(SDP) {
        alert('got peer 1 SDP');
        pc.setRemoteDescription(new mozRTCSessionDescription(SDP), function() { 
            pc.createAnswer(function(answerSDP){
                pc.setLocalDescription(answerSDP, function() {
                    socket.emit('answerSDP', answerSDP);
                    alert('sending answer');
                }, error2);
            }, error2);
        }, error2);
    });

    function start(){
        checkMedia();
        navigator.getUserMedia(mediaOptions, getMediaSuccess, error2);
    }

    function answer(offeredSDP){
        offeredSDP = new SessionDescription(offeredSDP);
    }

    function peer(){
        pc.addStream(local_stream);
        pc.createOffer(function(SDP){
            socket.emit('sendSDPtoServer', SDP);
        }, error2, offerConstraints);
    }

    function getMediaSuccess(stream){
        localvid.src = window.URL.createObjectURL(stream);
        local_stream = stream;
        peer(); ///////////
    }

    function error2(){
        alert('error');
    }


    function error3(){
        alert('error here');
    }

    function checkMedia() {
        if (!navigator.getUserMedia) {
            navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
        }
        if (!navigator.getUserMedia){
            alert('getUserMedia not supported in this browser.');
        }
    }

    function getBaseURL(){
        baseURL = location.protocol + "//" + location.hostname + ":" + location.port;
        return baseURL;
    }

start();
//alert('script');
</script>
</body>
</html>

服务器

var static = require('node-static');
var express = require('express');
var app = express();
var port = 8999;
var http = require('http');
var file= new(static.Server)();
var io = require('socket.io').listen(app.listen(port));
var connectedClients = {};
var peer1 = 0;
var peer2 = 0;
var peer1sdp = 0;
var peer2sdp = 0;

app.set('views', __dirname)
    .engine('html', require('ejs').renderFile)
    .use(express.static(__dirname + '/public'))
    .get('/', function(req, res) {
        //res.render('indexcpy.html');
    });




io.on('connection', function(socket) {
    console.log('a user connected');

        socket.on('disconnect', function(){
            console.log('user disconnected');
        });

        socket.on('answerSDP', function(answerSDP){
            console.log('ANSWER SENT');
            io.to(peer1).emit('receivedAnswer', answerSDP);
        });

        socket.on('sendSDPtoServer', function(SDP) {
            if(peer1 == 0){
                console.log('peer 1 ' + socket.id + ' has sent its SDP to server'); 
                peer1 = socket.id;
                peer1sdp = SDP;
            } else {
                console.log('peer 2 ' + socket.id + ' has been sent to the server');
                socket.emit('getPeer1', peer1sdp);
            }
        });



}); 

2 个答案:

答案 0 :(得分:2)

这里的错误是你的假设,pc.addStream(stream)会在同一个对等体上发起pc.onstream(event),但实际上会在远程对等体上触发它。

Reference

除此之外,您的webrtc代码不完整,而您的商品SDP到达服务器,它不会发送到远程对等方,而且它的答案也必须转发给您的同行,所以上...

答案 1 :(得分:0)

您必须确保在创建应答之前将本地流添加到对等连接。如果你显示你在哪里产生答案,那就更清楚了