forked from smpbo/rtmp-to-http
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rtmp2http.js
77 lines (65 loc) · 1.32 KB
/
rtmp2http.js
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
var url = require("url");
var querystring = require("querystring");
var fs = require("fs");
var request = require("request");
var child_process = require('child_process');
var liveStarted = false;
var liveffmpeg;
var clients = [];
var clen;
var headBuffer = null;
var rtmpURL = "rtmp://server/app/live_name";
function liveStream(req, resp) {
resp.writeHead(200, {
"Connection": "keep-alive",
"Content-Type": "video/mp4",
"Accept-Ranges": "bytes"
});
clients.push(resp);
clen = clients.length - 1;
if (headBuffer) {
resp.write(headBuffer);
}
if (!liveStarted) {
liveffmpeg = child_process.spawn("ffmpeg", [
"-re",
"-i",
rtmpURL,
"-c",
"copy",
"-f",
"flv",
"-"
], {
detached: true
});
liveStarted = true;
liveffmpeg.stdout.on("data", function(data) {
if (!headBuffer) {
headBuffer = Buffer.concat([data]);
}
for (var i = 0; i <= clen; i++) {
clients[i].write(data);
}
});
}
req.on("close", function() {
clearClient(resp);
})
req.on("end", function() {
clearClient(resp);
});
return true;
}
function clearClient(esp) {
var f = -1;
for (var i = 0; i < clients.length; i++) {
if (clients[i] == esp) {
f = i;
}
}
clients.splice(f, 1);
clen = clients.length - 1;
}
var http = require("http");
http.createServer(liveStream).listen(1337, "0.0.0.0");