Nginx is a web server with interesting modules to extend its functionality.
The Real Time Messaging Protocol (RTMP) is used to send video (& audio) streams
over the internet. Nginx offers a RTMP media streaming module.
Many action cams and drones support sending their video streams via RTMP.
This page is focused on the configuration of RTMP on Nginx.
sudo apt install nginx libnginx-mod-rtmp
/etc/nginx/nginx.conf
#...
# For rtmp, worker_processes needs to be 1, which is the default.
#worker_processes auto;
#...
rtmp {
server {
listen 1935;
# Who is allowed to connect can be handled with
# HTTP response status codes.
#on_connect http://example.net/rtmp_auth;
application live {
live on;
hls on;
hls_path /tmp/hls;
dash on;
dash_path /tmp/dash;
}
}
}
http {
#...
server {
listen 8080;
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
}
root /tmp;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
location /dash {
types {
application/dash+xml mpd;
}
root /tmp;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
}
#...
Reload the configuration:
sudo systemctl reload nginx
The following command creates a stream named stream
in
the configured application live
:
ffmpeg -re -i input.mp4 \
-c:v libx264 -c:a aac \
-f flv rtmp://example.net/live/stream
Receive the stream from the RTMP server and show it on screen:
ffplay -fflags nobuffer rtmp://example.net/live/stream
hls.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>HTTP Live Streaming</title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/hls.js@1"></script>
<video id="video" controls></video>
<script>
var video = document.getElementById('video');
var videoSrc = 'http://example.net:8080/hls/stream.m3u8';
if (Hls.isSupported()) {
var hls = new Hls();
hls.loadSource(videoSrc);
hls.on(Hls.Events.MEDIA_ATTACHED, function () {
video.muted = true;
video.play();
});
hls.attachMedia(video);
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = videoSrc;
}
</script>
</body>
</html>
HTTP Live Streaming (HLS) adds a delay / latency of approx. 10 to 60 seconds
to the live input stream.