-
-
Notifications
You must be signed in to change notification settings - Fork 56
/
setupTests.js
113 lines (95 loc) 路 2.92 KB
/
setupTests.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
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
106
107
108
109
110
111
112
113
const express = require('express');
const { spawn } = require('child_process');
const { path: ffmpegPath } = require('@ffmpeg-installer/ffmpeg');
const { join } = require('path');
const rtspRelay = require('..');
process.on('warning', (err) => {
if (err.name === 'MaxListenersExceededWarning') {
console.log(err.stack);
console.trace();
}
});
console.log(`Setting up RTSP server on ${process.platform} (${process.arch})`);
const rtspServer = spawn(
process.platform === 'win32'
? 'rtsp-simple-server' // you need to manually install it on windows
: join(__dirname, 'rtsp-simple-server'),
);
rtspServer.stdout.pipe(process.stdout);
rtspServer.stderr.pipe(process.stdout);
rtspServer.on('error', console.error);
rtspServer.on('close', process.exit);
const ffmpeg1 = spawn(
ffmpegPath,
'-re -stream_loop -1 -i test/video/sync-test-1.ts -c copy -f rtsp rtsp://localhost:8554/sync-test-1 -loglevel error'.split(
' ',
),
);
ffmpeg1.stdout.pipe(process.stdout);
ffmpeg1.stderr.pipe(process.stdout);
ffmpeg1.on('error', console.error);
ffmpeg1.on('close', process.exit);
const ffmpeg2 = spawn(
ffmpegPath,
'-re -stream_loop -1 -i test/video/sync-test-2.ts -c copy -f rtsp rtsp://localhost:8554/sync-test-2 -loglevel error'.split(
' ',
),
);
ffmpeg2.stdout.pipe(process.stdout);
ffmpeg2.stderr.pipe(process.stdout);
ffmpeg2.on('error', console.error);
ffmpeg2.on('close', process.exit);
const app = /** @type {import('express-ws').Application} */ (
/** @type {unknown} */ (express())
);
// setup streams here
const { proxy } = rtspRelay(app);
app.ws(
'/api/stream/1',
proxy({
url: `rtsp://localhost:8554/sync-test-1`,
verbose: true,
additionalFlags: ['-loglevel', 'error'],
}),
);
app.ws(
'/api/stream/2',
proxy({
url: `rtsp://localhost:8554/sync-test-2`,
verbose: true,
additionalFlags: ['-loglevel', 'error'],
}),
);
// this is an example html page to view the stream
app.get('/:n', (req, res) =>
res.send(`
<canvas></canvas>
<pre></pre>
<script src='https://cdn.jsdelivr.net/gh/phoboslab/jsmpeg@b5799bf/jsmpeg.min.js'></script>
<script>
const getTime = () => new Date().toISOString().split("T")[1].split(".")[0];
const log = e => document.querySelector('pre').innerHTML += getTime() + ": " + e + "\\n";
const listeners = [
"onPlay",
"onPause",
"onStalled",
"onSourceEstablished",
"onSourceCompleted"
].reduce((ac, e) => ({ ...ac, [e]: () => log(e) }), {});
new JSMpeg.Player('ws://' + location.host + '/api/stream/${req.params.n}', {
canvas: document.querySelector('canvas'),
${req.query.noLogs ? '' : '...listeners'}
});
log("camera ${req.params.n}");
</script>
`),
);
const server = app.listen(2000, () => console.log('ready'));
global.teardown = () => {
server.close(async () => {
ffmpeg1.kill();
ffmpeg2.kill();
await new Promise((cb) => setTimeout(cb, 1000));
rtspServer.kill();
});
};