rtsp-simple-server is a simple, ready-to-use and zero-dependency RTSP server, a software that allows multiple users to publish and read live video and audio streams. RTSP is a standardized protocol that defines how to perform these operations with the help of a server, that is contacted by both readers and publishers in order to negotiate a streaming protocol. The server is then responsible of relaying the publisher streams to the readers.
This software was developed with the aim of simulating a live camera feed for debugging purposes, and therefore to use files instead of real streams. Another reason for the development was the deprecation of FFserver, the component of the FFmpeg project that allowed to create a RTSP server (but this server is not bounded to FFmpeg and can be used with any software that supports publishing to RTSP).
- Read and publish streams via UDP and TCP
- Each stream can have multiple video and audio tracks, encoded in any format
- Publish multiple streams at once, each in a separate path, that can be read by multiple users
- Supports the RTP/RTCP streaming protocol
- Supports authentication
- Supports running a script when a client connects or disconnects
- Compatible with Linux, Windows and Mac, does not require any dependency or interpreter, it's a single executable
Installation and basic usage
Download and extract a precompiled binary from the release page.
Start the server:
Publish a stream. For instance, you can publish a video file with FFmpeg:
ffmpeg -re -stream_loop -1 -i file.ts -c copy -f rtsp rtsp://localhost:8554/mystream
Open the stream. For instance, you can open the stream with VLC:
gst-launch-1.0 -v rtspsrc location=rtsp://localhost:8554/mystream ! rtph264depay ! decodebin ! autovideosink
ffmpeg -i rtsp://localhost:8554/mystream -c copy output.mp4
Advanced usage and FAQs
Setup publisher authentication
Start the server and set a username and a password:
./rtsp-simple-server --publish-user=admin --publish-pass=mypassword
Only publishers that know both username and password will be able to publish:
ffmpeg -re -stream_loop -1 -i file.ts -c copy -f rtsp rtsp://admin:[email protected]:8554/mystream
WARNING: RTSP is a plain protocol, and the credentials can be intercepted and read by malicious users (even if hashed, since the only supported hash method is md5, which is broken). If you need a secure channel, use RTSP inside a VPN.
Remuxing, re-encoding, compression
rtsp-simple-server is an RTSP server: it publishes existing streams and does not touch them. It is not a media server, that is a far more complex and heavy software that can receive existing streams, re-encode them and publish them.
To change the format, codec or compression of a stream, you can use FFmpeg or Gstreamer together with rtsp-simple-server, obtaining the same features of a media server. For instance, if we want to re-encode an existing stream, that is available in the
/original path, and make the resulting stream available in the
/compressed path, it is enough to launch FFmpeg in parallel with rtsp-simple-server, with the following syntax:
ffmpeg -i rtsp://localhost:8554/original -c:v libx264 -preset ultrafast -tune zerolatency -b 600k -f rtsp rtsp://localhost:8554/compressed
Full command-line usage
usage: rtsp-simple-server [<flags>] rtsp-simple-server v0.0.0 RTSP server. Flags: --help Show context-sensitive help (also try --help-long and --help-man). --version print version --protocols="udp,tcp" supported protocols --rtsp-port=8554 port of the RTSP TCP listener --rtp-port=8000 port of the RTP UDP listener --rtcp-port=8001 port of the RTCP UDP listener --read-timeout=5s timeout of read operations --write-timeout=5s timeout of write operations --publish-user="" optional username required to publish --publish-pass="" optional password required to publish --publish-ips="" comma-separated list of IPs or networks (x.x.x.x/24) that can publish --read-user="" optional username required to read --read-pass="" optional password required to read --read-ips="" comma-separated list of IPs or networks (x.x.x.x/24) that can read --pre-script="" optional script to run on client connect --post-script="" optional script to run on client disconnect
Compile and run from source
Install Go ≥ 1.12, download the repository, open a terminal in it and run:
go run .
You can perform the entire operation inside Docker with: