This repository was archived by the owner on Jul 23, 2023. It is now read-only.
forked from tahaipek/Nodcam
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstream.js
More file actions
105 lines (96 loc) · 2.84 KB
/
Copy pathstream.js
File metadata and controls
105 lines (96 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Use the websocket-relay to serve a raw MPEG-TS over WebSockets. You can use
// ffmpeg to feed the relay. ffmpeg -> websocket-relay -> browser
// Example:
// node websocket-relay yoursecret 8081 8082
// ffmpeg -i <some input> -f mpegts http://localhost:8081/yoursecret
var fs = require("fs"),
http = require("http"),
WebSocket = require("ws");
if (process.argv.length < 3) {
console.log(
"Usage: \n" +
"node websocket-relay.js <secret> [<stream-port> <websocket-port>]"
);
process.exit();
}
var STREAM_SECRET = process.argv[2],
STREAM_PORT = process.argv[3] || 8081,
WEBSOCKET_PORT = process.argv[4] || 8082,
RECORD_STREAM = false;
// Websocket Server
var socketServer = new WebSocket.Server({
port: WEBSOCKET_PORT,
perMessageDeflate: false
});
socketServer.connectionCount = 0;
socketServer.on("connection", function(socket, upgradeReq) {
socketServer.connectionCount++;
console.log(
"New WebSocket Connection: ",
(upgradeReq || socket.upgradeReq).socket.remoteAddress,
(upgradeReq || socket.upgradeReq).headers["user-agent"],
"(" + socketServer.connectionCount + " total)"
);
socket.on("close", function(code, message) {
socketServer.connectionCount--;
console.log(
"Disconnected WebSocket (" + socketServer.connectionCount + " total)"
);
});
});
socketServer.broadcast = function(data) {
socketServer.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(data);
}
});
};
// HTTP Server to accept incomming MPEG-TS Stream from ffmpeg
var streamServer = http
.createServer(function(request, response) {
var params = request.url.substr(1).split("/");
if (params[0] !== STREAM_SECRET) {
console.log(
"Failed Stream Connection: " +
request.socket.remoteAddress +
":" +
request.socket.remotePort +
" - wrong secret."
);
response.end();
}
response.connection.setTimeout(0);
console.log(
"Stream Connected: " +
request.socket.remoteAddress +
":" +
request.socket.remotePort
);
request.on("data", function(data) {
socketServer.broadcast(data);
if (request.socket.recording) {
request.socket.recording.write(data);
}
});
request.on("end", function() {
console.log("close");
if (request.socket.recording) {
request.socket.recording.close();
}
});
// Record the stream to a local file?
if (RECORD_STREAM) {
var path = "recordings/" + Date.now() + ".ts";
request.socket.recording = fs.createWriteStream(path);
}
})
.listen(STREAM_PORT);
console.log(
"Listening for incomming MPEG-TS Stream on http://127.0.0.1:" +
STREAM_PORT +
"/" +
STREAM_SECRET
);
console.log(
"Awaiting WebSocket connections on ws://127.0.0.1:" + WEBSOCKET_PORT + "/"
);