hera-rtsp-relay
v1.0.0-4
Published
4HERA Relay an RTSP stream through an existing express.js server
Downloads
8
Maintainers
Readme
4HERA RTSP Relay
Install
npm install -S hera-rtsp-relay express
You don't need to install ffmpeg!
Example
const express = require('express');
const app = express();
const { proxy, scriptUrl } = require('hera-rtsp-relay')(app);
const handler = proxy({
url: `rtsp://admin:[email protected]:554/feed`,
// if your RTSP stream need credentials, include them in the URL as above
verbose: false,
});
// the endpoint our RTSP uses
app.ws('/api/stream', handler);
// this is an example html page to view the stream
app.get('/', (req, res) =>
res.send(`
<canvas id='canvas'></canvas>
<script src='${scriptUrl}'></script>
<script>
loadPlayer({
url: 'ws://' + location.host + '/api/stream',
canvas: document.getElementById('canvas')
});
</script>
`),
);
app.listen(2000);
Usage with many cameras
If you have hundreds of cameras and don't want to define a seperate route for each one, you can use a dynamic URL:
app.ws('/api/stream/:cameraIP', (ws, req) =>
proxy({
url: `rtsp://${req.params.cameraIP}:554/feed`,
})(ws),
);
Usage with many clients
You may see a MaxListenersExceededWarning
if the relay is re-transmitting 10+ streams at once, or if 10+ clients are watching.
This is expected, and you can silence the warning by adding process.setMaxListeners(0);
to your code.
Improving the video quality
Depending on your network configuration, you can try the following options to improve the stream quality:
// try this:
app.ws('/api/stream', proxy({ additionalFlags: ['-q', '1'] }));
// or this:
app.ws('/api/stream', proxy({ transport: 'tcp' }));
Note that both these methods will use more bandwidth.
SSL
If you want to use HTTPS, you will need to change the stream URL to wss://
, like the following example:
const rtspRelay = require('hera-rtsp-relay');
const express = require('express');
const https = require('https');
const fs = require('fs');
const key = fs.readFileSync('./privatekey.pem', 'utf8');
const cert = fs.readFileSync('./fullchain.pem', 'utf8');
const ca = fs.readFileSync('./chain.pem', 'utf8'); // required for iOS 15+
const app = express();
const server = https.createServer({ key, cert, ca }, app);
const { proxy, scriptUrl } = rtspRelay(app, server);
app.ws('/api/stream', proxy({ url: 'rtsp://1.2.3.4:554' }));
app.get('/', (req, res) =>
res.send(`
<canvas id='canvas'></canvas>
<script src='${scriptUrl}'></script>
<script>
loadPlayer({
url: 'wss://' + location.host + '/api/stream',
canvas: document.getElementById('canvas')
});
</script>
`),
);
server.listen(443);