Node JS (Socket.io + WebCam)

Вступление

Всем доброго времени суток! Хотелось бы поделиться с вами небольшим приложением для создания видео трансляции на NodeJS через socket.io

Создадим отдельную папку для приложения.

Файл Package.json :

{
  "name": "WebCam",
  "version": "0.0.1",
  "dependencies": {
    "express": "*",
    "log": "*",
    "socket.io": "*"
  }
}

Как вы уже наверняка заметили, всего используется 3 библиотеки: express, log и socket.io

Файл App.js :

// Подключение библиотек
var fs = require('fs');
var express = require("express");
var app = new express();
// Устанавливаем порт, по умолчанию 8888
var port = process.env.PORT || 8888;
// Проверка, используем ли мы HTTPS (SSL) , по умолчанию да
var ssl = (process.env.SSL == null || process.env.SSL != 0) ? 1:0;
if(ssl==1) {
	var https = require('https');
	var server = https.createServer(
{key: fs.readFileSync('/var/ssl/cert.key'),cert: fs.readFileSync('/var/ssl/cert.crt')}, app);
	console.log("Use SSL");
} else {
	var server = require('http').createServer(app);
console.log("Start http");
}
var io = require("socket.io")(server);

//io.set('origins', 'mdewo.com:'+port); // Доступ только через указанный домен
var Log = require("log"),
	log = new Log("debug");


app.use(express.static( __dirname + "/public" ));

app.get("/", function(req, res) {
	res.redirect("index.html");
});

server.listen(port, function() {
	log.info("запущен на %s порт", port);
});

io.on("connection", function(socket) {
	log.info("Новый клиент");
	// Вещаем видео всем клиентам
	socket.on("stream", function(img) {
		socket.broadcast.emit("stream", img);
	});
});

Теперь в каталоге /public который должен находится в папке с нашим приложением создадим Файл index.html :

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>WebCam</title>
	<script src="//code.jquery.com/jquery-2.2.1.min.js"></script>
	<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<a onclick="view(); return false">Смотреть</a>
<a onclick="stream(); return false">Стримить</a>
	<div id="logger"></div>
	<video style="display: none;" id="video"> </video>
	<canvas id="prev"></canvas>

	<img id="img">

	<script>
	var socket = io();

	function logger(msg) {
		$("#logger").text(msg);
	}

	function stream() {
		var canv = document.getElementById("prev"),
		context = canv.getContext("2d"),
		video = document.getElementById("video"),
		freq = 10;

		canv.width = window.innerWidth ;//  800;
		canv.height = window.innerHeight;// 400;
		
		context.width = canv.width;
		context.height = canv.height;

		function loadCam(stream) {
			video.src = window.URL.createObjectURL(stream);
			logger("Camera loaded [OKAY]");
		}
		
		function loadFail(stream) {
			logger("Failed loading camera");
		}
		
		function viewVideo(video, context) {
			context.drawImage(video, 0, 0, context.width, context.height);
			socket.emit("stream", canv.toDataURL("image/webp"));
		}
		
		$(function() {
			navigator.getUserMedia = navigator.getUserMedia ||
                         navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia;
			
			if(navigator.getUserMedia) {
				navigator.getUserMedia({video: true}, loadCam, loadFail);
			}
			setInterval(function() {
				viewVideo(video, context);
			}, freq*10);
		});
	}

	function view() {
		logger("Ждем стрим...");
		socket.on("stream", function (video) {
			var img = document.getElementById("img");
			img.src = video;
			logger("Стрим запущен");
		});
	}
	</script>
</body>
</html>
Так же можете уменьшить задержку.. тем самым увеличив частоту обновления картинки (в js var FREQ)
Теперь запустим приложение через SSH-> SSL=1 PORT=8888 node app.js
И переходим на сайт, к примеру https://mdewo.com:8888

Потом нажимаем Стримить и разрешаем доступ к камере. Открываем такую же страничку, но уже нажимаем Смотреть, вы должны увидеть ваше видео…

Браузер Chrome заботясь о вашей безопасности ограничил запретил доступ к камере сайтам у которых отсутствуем SSL сертификат! Поэтому в приложение добавлена поддержка SSL, но вы можете просто при запуске приложения указать SSL=0, тогда приложение запуститься по обычному протоколу http.



Ваш комментарий будет первым!