我正在尝试创建一个基本的类似于时间的应用程序,但是我很难在前端显示摄像机显示框。我的后端服务器代码似乎可以运行,但是说实话,我不确定,因为前端没有任何结果,因此我没有成功。我提供了client.js,server.js和index.html文件。任何帮助将不胜感激。
Server.JS
//requires
const express = require('express');
const app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
// express routing
app.use(express.static('public'));
// signaling
io.on('connection', function (socket) {
console.log('a user connected');
socket.on('create or join', function (room) {
console.log('create or join to room ', room);
var myRoom = io.sockets.adapter.rooms[room] || { length: 0 };
var numClients = myRoom.length;
console.log(room, ' has ', numClients, ' clients');
if (numClients == 0) {
socket.join(room);
socket.emit('created', room);
} else if (numClients == 1) {
socket.join(room);
socket.emit('joined', room);
} else {
socket.emit('full', room);
}
});
socket.on('ready', function (room){
socket.broadcast.to(room).emit('ready');
});
socket.on('candidate', function (event){
socket.broadcast.to(event.room).emit('candidate', event);
});
socket.on('offer', function(event){
socket.broadcast.to(event.room).emit('offer',event.sdp);
});
socket.on('answer', function(event){
socket.broadcast.to(event.room).emit('answer',event.sdp);
});
});
// listener
http.listen(3000, function () {
console.log('listening on port 3000');
});
Client.JS
// getting dom elements
var divSelectRoom = document.getElementById("selectRoom");
var divConsultingRoom = document.getElementById("consultingRoom");
var inputRoomNumber = document.getElementById("roomNumber");
var btnGoRoom = document.getElementById("goRoom");
var localVideo = document.getElementById("localVideo");
var remoteVideo = document.getElementById("remoteVideo");
// variables
var roomNumber;
var localStream;
var remoteStream;
var rtcPeerConnection;
var iceServers = {
'iceServers': [
{ 'url': 'stun:stun.services.mozilla.com' },
{ 'url': 'stun:stun.l.google.com:19302' }
]
}
var streamConstraints = { audio: true, video: true };
var isCaller;
// Let's do this
var socket = io();
btnGoRoom.onclick = function () {
if (inputRoomNumber.value === '') {
alert("Please type a room number")
} else {
roomNumber = inputRoomNumber.value;
socket.emit('create or join', roomNumber);
divSelectRoom.style = "display: none;";
divConsultingRoom.style = "display: block;";
}
};
// message handlers
socket.on('created', function (room) {
navigator.mediaDevices.getUserMedia(streamConstraints).then(function (stream) {
localStream = stream;
localVideo.src = URL.createObjectURL(stream);
isCaller = true;
}).catch(function (err) {
console.log('An error ocurred when accessing media devices');
});
});
socket.on('joined', function (room) {
navigator.mediaDevices.getUserMedia(streamConstraints).then(function (stream) {
localStream = stream;
localVideo.src = URL.createObjectURL(stream);
socket.emit('ready', roomNumber);
}).catch(function (err) {
console.log('An error ocurred when accessing media devices');
});
});
socket.on('candidate', function (event) {
var candidate = new RTCIceCandidate({
sdpMLineIndex: event.label,
candidate: event.candidate
});
rtcPeerConnection.addIceCandidate(candidate);
});
socket.on('ready', function () {
if (isCaller) {
rtcPeerConnection = new RTCPeerConnection(iceServers);
rtcPeerConnection.onicecandidate = onIceCandidate;
rtcPeerConnection.onaddstream = onAddStream;
rtcPeerConnection.addStream(localStream);
rtcPeerConnection.createOffer(setLocalAndOffer, function(e){console.log(e)});
}
});
socket.on('offer', function (event){
if(!isCaller){
rtcPeerConnection = new RTCPeerConnection(iceServers);
rtcPeerConnection.onicecandidate = onIceCandidate;
rtcPeerConnection.onaddstream = onAddStream;
rtcPeerConnection.addStream(localStream);
rtcPeerConnection.setRemoteDescription(new RTCSessionDescription(event));
rtcPeerConnection.createAnswer(setLocalAndAnswer, function(e){console.log(e)});
}
});
socket.on('answer', function (event){
rtcPeerConnection.setRemoteDescription(new RTCSessionDescription(event));
})
// handler functions
function onIceCandidate(event) {
if (event.candidate) {
console.log('sending ice candidate');
socket.emit('candidate', {
type: 'candidate',
label: event.candidate.sdpMLineIndex,
id: event.candidate.sdpMid,
candidate: event.candidate.candidate,
room: roomNumber
})
}
}
function onAddStream(event) {
remoteVideo.src = URL.createObjectURL(event.stream);
remoteStream = event.stream;
}
function setLocalAndOffer(sessionDescription) {
rtcPeerConnection.setLocalDescription(sessionDescription);
socket.emit('offer', {
type: 'offer',
sdp: sessionDescription,
room: roomNumber
});
}
function setLocalAndAnswer(sessionDescription) {
rtcPeerConnection.setLocalDescription(sessionDescription);
socket.emit('answer', {
type: 'answer',
sdp: sessionDescription,
room: roomNumber
});
}
Index.html
<!DOCTYPE html>
<head>
<title>FaceTime</title>
</head>
<body>
<h1>FaceTime</h1>
<div id="selectRoom">
<label>Type the room number</label>
<input id="roomNumber" type="text" />
<button id="goRoom">Go</button>
</div>
<div id="consultingRoom" style="display:none">
<video id="localVideo" autoplay></video>
<video id="remoteVideo" autoplay></video>
</div>
<script src="/socket.io/socket.io.js"></script>
<script src="client.js"></script>
</body>