首页 > 解决方案 > WebRTC NodeJS 到 js

问题描述

我有一个问题,我在 js 中有这些文件,我需要创建一个 webrtc。问题是托管不支持nodejs。我想知道是否可以在 js 中更改它们以使其工作。我可以复制我需要的请求文件(“node-static”)并将它们放在主机中吗?帮帮我,我不知道如何继续。非常感谢


服务器.js

var static = require('node-static');
var https = require('https');
var util = require('util');
var file = new(static.Server)();
var app = https.createServer(function (req, res) {
    file.serve(req, res);
}).listen(443);

var io = require('socket.io').listen(app);

io.sockets.on('connection', function (socket){

  // convenience function to log server messages on the client
    function log(){
        var array = [">>> Message from server: "];
      for (var i = 0; i < arguments.length; i++) {
        array.push(arguments[i]);
      }
        socket.emit('log', array);
    }

    // when receive sdp, broadcast sdp to other user
    socket.on('sdp', function(data){
        console.log('Received SDP from ' + socket.id);
        socket.to(data.room).emit('sdp received', data.sdp);
    });

    // when receive ice candidate, broadcast sdp to other user
    socket.on('ice candidate', function(data){
        console.log('Received ICE candidate from ' + socket.id + ' ' + data.candidate);
        socket.to(data.room).emit('ice candidate received', data.candidate);
    });

    socket.on('message', function (message) {
        log('Got message:', message);
    // for a real app, would be room only (not broadcast)
        socket.broadcast.emit('message', message);
    });

    socket.on('create or join', function (room) {
        // join room
        var existingRoom = io.sockets.adapter.rooms[room];
        var clients = [];

        if(existingRoom){
            clients = Object.keys(existingRoom);
        }

        if(clients.length == 0){
            socket.join(room);
            io.to(room).emit('empty', room);
        }
        else if(clients.length == 1){
            socket.join(room);
            socket.to(room).emit('joined', room, clients.length + 1);
        }
        // only allow 2 users max per room
        else{
            socket.emit('full', room);
        }
    });

    socket.on('error', function(error){
        console.error(error);
    })

});

main.js

"use strict"

//my signalling server
var serverIP = "https://www.website.com/";

// RTCPeerConnection Options
var server = {
    // Uses Google's STUN server
    iceServers: [{ 
        "urls" :
            navigator.mozGetUserMedia    ? "stun:stun.services.mozilla.com" :
            navigator.webkitGetUserMedia ? "stun:stun.l.google.com:19302"   :
                                           "stun:23.21.150.121"
        }
    ]
};

var localPeerConnection, signallingServer;
var localStream, localIsCaller;

function disconnect() {

    var localVideo = document.getElementById('from-video');
    var remoteVideo = document.getElementById('to-video');

    // stop video stream
    if (localStream != null) {
        let tracks = localStream.getTracks();
        tracks.forEach(function(track) {
            track.stop();
        });
    }

    // kill all connections
    if (localPeerConnection != null) {
        localPeerConnection.getSenders().forEach(function(sender){
            localStream.getTracks().forEach(function(track){
              if(track == sender.track){
                localPeerConnection.removeTrack(sender);
              }
            })
        });

        localPeerConnection.close();
        signallingServer.close();
        localVideo.src = "";
        remoteVideo.src = "";
    }
}

// WEBRTC STUFF STARTS HERE
// Set objects as most are currently prefixed
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection ||
    window.webkitRTCPeerConnection || window.msRTCPeerConnection;
window.RTCSessionDescription = window.RTCSessionDescription || window.mozRTCSessionDescription ||
    window.webkitRTCSessionDescription || window.msRTCSessionDescription;
navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia ||
    navigator.webkitGetUserMedia || navigator.msGetUserMedia;
window.SignallingServer = window.SignallingServer;

var sdpConstraints = {
    optional: [],
    mandatory: {
        OfferToReceiveVideo: true,
    }
}

function connect_video(room) {
    // create peer connection
    localPeerConnection = new RTCPeerConnection(server);

    // create local data channel, send it to remote
    navigator.getUserMedia({
        video: true,
        audio: true
    }, function(stream) {
        // get and save local stream
        trace('Got stream, saving it now and starting RTC conn');

        // must add before calling setRemoteDescription() because then 
        // it triggers 'addstream' event
        localPeerConnection.addStream(stream);
        localStream = stream;

        // show local video
        var localVideo = document.getElementById('from-video');
        localVideo.srcObject = stream;
        localVideo.onloadedmetadata = function(e) {
            localVideo.play();
        };
        // can start once have gotten local video
        establishRTCConnection(room);

    }, errorHandler)
}

function connect_audio(room) {
    // create peer connection
    localPeerConnection = new RTCPeerConnection(server);

    // create local data channel, send it to remote
    navigator.getUserMedia({
        video: false,
        audio: true
    }, function(stream) {
        // get and save local stream
        trace('Got stream, saving it now and starting RTC conn');

        // must add before calling setRemoteDescription() because then 
        // it triggers 'addstream' event
        localPeerConnection.addStream(stream);
        localStream = stream;

        // show local video
        var localVideo = document.getElementById('from-video');
        localVideo.srcObject = stream;
        localVideo.onloadedmetadata = function(e) {
            localVideo.play();
        };
        // can start once have gotten local video
        establishRTCConnection(room);

    }, errorHandler)
}

function establishRTCConnection(room) {
    // create signalling server
    signallingServer = new SignallingServer(room, serverIP);
    signallingServer.connect();

    // a remote peer has joined room, initiate sdp exchange
    signallingServer.onGuestJoined = function() {
        trace('guest joined!')
        // set local description and send to remote
        localPeerConnection.createOffer(function(sessionDescription) {
            trace('set local session desc with offer');

            localPeerConnection.setLocalDescription(sessionDescription);

            // send local sdp to remote
            signallingServer.sendSDP(sessionDescription);
        });
    }

    // got sdp from remote
    signallingServer.onReceiveSdp = function(sdp) {
        // get stream again
        localPeerConnection.addStream(localStream);
        trace(localStream)

        // if local was the caller, set remote desc
        if (localIsCaller) {
            trace('is caller');
            trace('set remote session desc with answer');
            localPeerConnection.setRemoteDescription(new RTCSessionDescription(
                sdp));
        }
        // if local is joining a call, set remote sdp and create answer
        else {
            trace('set remote session desc with offer');
            localPeerConnection.setRemoteDescription(new RTCSessionDescription(
                sdp), function() {
                trace('make answer')
                localPeerConnection.createAnswer(function(
                    sessionDescription) {
                    // set local description
                    trace('set local session desc with answer');
                    localPeerConnection.setLocalDescription(
                        sessionDescription);

                    // send local sdp to remote too
                    signallingServer.sendSDP(sessionDescription);
                });
            });
        }
    }

    // when received ICE candidate
    signallingServer.onReceiveICECandidate = function(candidate) {
        trace('Set remote ice candidate');
        localPeerConnection.addIceCandidate(new RTCIceCandidate(candidate));
    }

    // when room is full
    signallingServer.onRoomFull = function(room) {
        console.log('Room "' + room +
            '"" is full! Please join or create another room');
    }

    // get ice candidates and send them over
    // wont get called unless SDP has been exchanged
    localPeerConnection.onicecandidate = function(event) {
        if (event.candidate) {
            //!!! send ice candidate over via signalling channel
            trace("Sending candidate");
            signallingServer.sendICECandidate(event.candidate);
        }
    }

    // when stream is added to connection, put it in video src
    localPeerConnection.ontrac = function(data) {
        var remoteVideo = document.getElementById('to-video');
        remoteVideo.srcObject = data.stream;
        remoteVideo.onloadedmetadata = function(e) {
            remoteVideo.play();
        };
    }

}

function errorHandler(error) {
    console.log('Something went wrong!');
    console.log(error);
}

function trace(text) {
    console.log(text);
}

和另一个文件,如 signalling.js、adapter.js、socket.io.js

标签: javascriptnode.jswebrtc

解决方案


不,你不能。您将需要具有 nodejs 支持的主机或可以在其中运行 vm 的主机。这些脚本是服务器端脚本,它们需要始终在服务器上运行。让它们在客户端运行是没有意义的,因为没有地方可以连接。


推荐阅读