How to Stream Video with RTSP on VOXL
Table of contents
- Overview
- General Use as a Service
- Configuration File
- Two Primary Modes
- Running Multiple Instances
- Command Line Reference
- Troubleshooting
Overview
voxl-streamer is a background service that subscribes to MPA image streams, compresses them if necessary, and makes them available as an RTSP stream at:
rtsp://<VOXL_IP>:8900/live
The port is configurable (default 8900); the /live mount point is fixed. This is enabled by default on most systems to enable automatic streaming of video to QGroundControl by voxl-mavcam-manager — FPV SKUs are the exception, where video ships through voxl-vtx instead.
This video shows setting up a 720p encoded video stream with a VOXL 2 and IMX412: YouTube
General Use as a Service
voxl-streamer runs in the background via its systemd service (visible in voxl-inspect-services), started with no arguments — all behavior comes from the config file. Manage it with:
voxl-configure-streamer factory_enable # reset config to defaults and enable
voxl-configure-streamer enable # enable (starts on next reboot)
voxl-configure-streamer disable # disable and stop
Multiple RTSP clients can watch the same stream simultaneously — the encoded media is shared. When no clients are connected, voxl-streamer disconnects from the MPA pipe entirely to save power and CPU, reconnecting when the next client shows up.
Configuration File
/etc/modalai/voxl-streamer.conf (JSON, created with defaults on first run):
| Field | Default | Meaning |
|---|---|---|
input-pipe | hires_small_encoded | MPA camera pipe to subscribe to |
port | 8900 | RTSP port to serve on |
bitrate | 1000000 | Bitrate for onboard encoding — raw input only (see below) |
decimator | 1 | Drop frames to reduce framerate — raw input only |
rotation | 0 | Rotate the video 0/90/180/270 degrees — raw input only |
encoder | h264 | Onboard encoder when input is not already encoded: h264 or h265 |
Two Primary Modes
Pre-encoded input (default). voxl-streamer can subscribe to pre-encoded H264 or H265 MPA pipes such as the default hires_small_encoded. This is most efficient: frames pass straight through to RTSP with no re-encode. In this mode the bitrate, rotation, and decimator fields are ignored — set bitrate and GOP in voxl-camera-server.conf instead.
Raw input. When pointed at an uncompressed pipe (RAW8, NV12, YUV, RGB — e.g. tracking or qvio_overlay), voxl-streamer builds a GStreamer pipeline that can rotate, decimate, and compress the video to the configured bitrate using the platform’s hardware encoder. This works well but is less efficient than pre-encoded input.
The original VOXL (apq8096) supports H264 onboard encoding only —
encoder: h265errors out there. VOXL 2 supports both.
Running Multiple Instances
Each voxl-streamer process serves one stream. To stream a second camera alongside the background service, launch another instance with --standalone (so it doesn’t kill the service’s process) and a unique --port:
voxl-streamer --standalone --port 8901 -i tracking
That second stream is then at rtsp://<VOXL_IP>:8901/live.
Running
voxl-streamerby hand without--standalonekills the running background service instance — that’s by design, so a manual run can take over cleanly.
Command Line Reference
-b --bitrate <#> | Override bitrate specified in the config file
-c --config | Load config file only and quit (used for scripted setup)
-d --decimator <#> | Override the decimator specified in the config file
-h --help | Print this help message
-i --input-pipe <name> | Override the input pipe specified in the config file
-e --encoder <type> | Choose video encoder h264 or h265 (if video is not already encoded)
-p --port <#> | Override the RTSP port number specified in the config file
-s --standalone | Use this to launch a new instance alongside the default service
-v --verbosity <#> | Log verbosity level (Default 2)
CLI flags override the config file. Tab completion is installed — -i completes live camera pipes.
Troubleshooting
For general service debugging — logs, restarts, running in the foreground — see Debugging Services.
- Stream won’t open: confirm the service is running (
voxl-inspect-services) and the configuredinput-pipeexists (voxl-list-pipes). The startup log prints the stream URL. - Choppy or stalling video: voxl-streamer drops frames rather than buffering under load; if the source pipe backs up it is flushed. Reduce resolution/bitrate at the source, or lower the framerate with
decimator(raw input). Frame size mismatch ... Shutting down: the pipe’s advertised frame size doesn’t match reality — usually a camera configuration change; re-checkvoxl-configure-cameras.- Rotation/bitrate/decimator “not working”: those only apply to raw input — with a pre-encoded pipe, adjust
voxl-camera-server.conf. - If the camera server restarts, voxl-streamer automatically reconnects and re-serves the stream.
For a deeper latency-focused setup, see Low Latency Video Streaming.