使用webrtc + node.js进行视频会议



首先对不起我的英语不好。我正在尝试使用WebRTC进行视频通话,但它不起作用。我正在使用node.js + socket.io + express作为服务器。感谢您给我的任何帮助或建议。谢谢。这是我的代码。

服务器

var express = require('express')
  , io = require('socket.io')
  , app = express()
  , server = require('http').createServer(app)
  , io = io.listen(server);
server.listen(8080);
app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});
var usuarios = [];
io.sockets.on('connection', function (socket) {
    usuarios.push(socket);
    console.log('Nuevo usuario conectado - ' + usuarios.length + ' en total');
    socket.on('message', function (mensaje) { 
        usuarios.forEach(function (usuario) {
            if (usuario != socket) {
                usuario.send(mensaje);
            }
        });
    });
    socket.on('disconnect', function () { 
        console.log("Usuario desconectado");
        // ...
    });
});

客户

<html>
    <head>
        <title>Cliente</title>
    </head>
    <body>
        <video id='videolocal' autoplay style='width: 200px; height: 150px; border: 1px solid black;'></video>
        <video id='videoremoto' autoplay style='width: 200px; height: 150px; border: 1px solid black;'></video>
        <button type="button" onclick="iniciarCamara();">Iniciar Camara</button>
        <button type="button" onclick="pararCamara();">Parar Camara</button>
        <button type="button" onclick="conectar();">Conectar</button>
        <button type="button" onclick="desconectar();">Desconectar</button>
        <script src="/socket.io/socket.io.js"></script>
        <script>
            var socket = io.connect('http://localhost:8080');
            var videolocal = document.getElementById('videolocal');
            var videoremoto = document.getElementById('videoremoto');
            var streamlocal = null;
            var pc = null;
            var conectado = false;
            window.URL = window.URL || window.webkitURL;
            navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
            socket.on('message', function (mensaje) {
                var msg = JSON.parse(mensaje);
                if (msg.type === 'oferta') {
                    pc.setRemoteDescription(pc.SDP_OFFER, new SessionDescription(msg.sdp));
                    responder();
                } else if (msg.type === 'respuesta' && conectado) {
                    pc.setRemoteDescription(pc.SDP_ANSWER, new SessionDescription(msg.sdp));
                } else if (msg.type === 'candidate' && conectado) {
                    var candidate = new IceCandidate(msg.label, msg.candidate);
                    pc.processIceMessage(candidate);
                } else if (msg.type === 'desconectar' && conectado) {
                    //...
                }
            });
            function responder() {
                var oferta = pc.remoteDescription;
                var respuesta = pc.createAnswer(oferta.toSdp(), {has_audio:true, has_video:true});
                pc.setLocalDescription(pc.SDP_ANSWER, respuesta);
                socket.send({type: 'respuesta', sdp: respuesta.toSdp()});
                pc.startIce();
            }
            function crearPeerConnection() {
                pc = new webkitPeerConnection00(null, iceCallback);
                pc.addEventListener("addstream", anadirStreamRemoto, false);
                pc.addEventListener("removestream", eliminarStreamRemoto, false);
                function anadirStreamRemoto(event) {
                    videoremoto.src = window.webkitURL.createObjectURL(event.stream);
                }
                function eliminarStreamRemoto(event) {
                    videoremoto.src = "";
                }
            }
            function iniciarCamara() {
                navigator.getUserMedia({video: true, audio: true}, okCallback, errorCallback);
                function okCallback(stream) {
                    videolocal.src = window.URL.createObjectURL(stream);
                    streamlocal = stream;
                }
                function errorCallback(error) {
                    alert("Error");
                    return;
                }
            }
            function pararCamara() {
                videolocal.src = "";
            }
            function iceCallback(candidate, bMore) {
                if(candidate) {
                    socket.send({type: 'candidate', label: candidate.label, candidate: candidate.toSdp()});
                }
            }
            function conectar() {
                if (!conectado && streamlocal) {
                    crearPeerConnection();
                    conectado = true;
                    var oferta = pc.createOffer({has_audio:true, has_video:true});
                    pc.setLocalDescription(pc.SDP_OFFER, oferta);
                    socket.send({type: 'oferta', sdp: oferta.toSdp()});
                    pc.startIce();
                } else {
                    alert("No se ha iniciado el stream local");
                }
            }
            function desconectar() {
                pc.close();
                pc = null;
                conectado = false;
            }
    </script>
</body>

错误

Uncaught SyntaxError: Unexpected token o localhost:25
(anonymous function) localhost:25
EventEmitter.emit socket.io.js:633
SocketNamespace.onPacket socket.io.js:2239
Socket.onPacket socket.io.js:1930
Transport.onPacket socket.io.js:1332
Transport.onData socket.io.js:1303
websocket.onmessage

问候。

你必须在 socket.io 方法 .send() 发送消息时发送 jsObjects,要提供数据,你需要使用 .emit() 方法,所以你必须替换所有

socket.send({...});

跟:

socket.emit('message', {...})

所以你必须删除这一行:

var msg = JSON.parse(mensaje);

相关内容

  • 没有找到相关文章

最新更新