Manual / Setup
Video Inputs
OpenFollow accepts video over network protocols and direct connections. Each input plugs into the same GStreamer pipeline; what differs is how the source is described and authenticated. Pick whichever gives you the lowest stable latency at 720p–1080p, 25–30 fps.
Sources are configured under Camera & Grid → Video Source in the web UI (or step 3 of the Setup Wizard). Pipeline changes apply live within ~1 second of saving.
Choosing a source
| Source | When to use it | Latency |
|---|---|---|
| RTSP Recommended | Most IP cameras, HDMI/SDI-to-IP encoders | 2–3 frames (professional cameras) |
| SRT | If you have no other options and an unreliable network | 2–3 frames (professional cameras) |
| RTP | Tightly-controlled local pipelines you generate yourself | Varies widely; can be very low |
| NDI® 1 2 | NDI®-native cameras and software sources | Typically 5–7 frames |
| Pi Camera (CSI) | Pi Camera modules, CSI capture adapters | Lowest overall (no network) |
| USB Camera | UVC webcams, USB capture cards | Varies by vendor |
| Media Gallery | Bench testing without a camera; play a stored still or clip | n/a |
RTSP
Field: RTSP URL, e.g.
rtsp://192.168.178.58:554/stream/main
For cameras that require auth, embed credentials in the URL (URL-encode special characters):
rtsp://operator:secret@192.168.178.58:554/stream1
Recommended camera settings
- Resolution: 1920×1080 or 1280×720.
- Frame rate: 25 or 30 fps.
- Encoding: H.264 baseline or main profile. AV1 / H.265 work but cost more CPU on the Pi.
- Bitrate: CBR, 4–8 Mbps.
- I-frame interval: 1× framerate (one I-frame per second). Lower means faster pipeline recovery on packet loss but more bandwidth.
- Disable the camera’s “smart” features – motion detection, IR cut, auto-exposure flicker, perspective correction.
SRT
Field: SRT URL, e.g.
srt://0.0.0.0:5000 # listener mode
srt://203.0.113.10:5000 # caller mode
RTP
For RTP, you usually generate the stream yourself with FFmpeg, GStreamer, or a hardware encoder you control.
Fields: RTP URL and Encoding (H264, H265, etc.). Default URL form:
rtp://0.0.0.0:5004
NDI®
NDI® input requires the closed-source NDI® SDK and the GStreamer NDI® plugin to be installed on the Pi separately – see Installing NDI®.
Once installed, the wizard auto-discovers visible NDI® sources on the network. Pick the source name from the dropdown.
Raspberry Pi Camera (CSI)
Pi Camera modules and CSI capture adapters connect via the Pi’s ribbon-cable camera port, decoded with libcamera.
Fields:
- Camera Name – leave blank for the default. If multiple CSI cameras are connected, the dropdown lists detected camera names.
- Width / Height / Framerate – defaults
1920 × 1080 @ 30 fps.
Adapters that bridge HDMI or SDI to CSI (e.g. the official Pi HDMI capture HAT) appear here too – they show up to libcamera as a camera.
USB Camera
UVC webcams and USB capture cards (HDMI/SDI-to-USB).
Fields:
- Device – the capture device; Scan re-enumerates what's connected.
- Render resolution – the size the feed is processed at: Native size, or a downscale preset 2160p / 1080p / 720p (default 1080p). The device is read at its own native resolution and scaled to this size, so a lower preset cuts CPU; Native size passes the device resolution through untouched.
- FPS – default
30.
Because the device negotiates its own native format, this works with capture cards that only output the incoming signal's resolution – a 4K HDMI feed connects and is downscaled to the render size. USB capture is processing-heavy: on a Raspberry Pi, keep the render resolution at 1080p rather than Native size for a 4K source. Capture-card latency varies by vendor.
Media Gallery
A device-local library of still images and short looping clips, used as the video source when no camera is connected. It ships with two bundled items for bench-testing calibration and detection: Stage (a still theatre-stage scene) and Grey (a plain grey card). Neither can be deleted.
Manage the gallery from the browser under Camera & Grid → Video Source. Click a tile to make it the source; the selected tile carries an amber border. If the current selection stops resolving – its media was deleted, or a config imported from another station points at media this station doesn't have – the source falls back to Stage.
Adding media
- Upload – add your own stills (JPEG / PNG / WebP, normalised to 1080p JPEG) or clips (VP8 WebM, up to 1080p / 30 fps / 60 s; audio is ignored). Other codecs are rejected. Per-tile buttons download or delete media you added.
- Capture frame – while any live source is active, this button saves the current clean frame into the gallery at its native resolution. Use it to grab a still of your actual stage to calibrate against later.
Clips are not transcoded on the device, so prepare a conforming VP8 WebM on a workstation first, for example:
ffmpeg -i in.mp4 \
-vf "scale='min(1920,iw)':'min(1080,ih)':force_original_aspect_ratio=decrease,fps=30" \
-t 60 -an -c:v libvpx -b:v 6M -crf 10 out.webm
The gallery is device-local: it stays on the station you set it on and never travels with a config export or import, so a shared config can't overwrite what a station is showing. The on-display Settings menu can select the Media Gallery as the source but not change its contents.
Switching sources while running
The pipeline rebuild on save is non-disruptive – markers and PSN output keep running. If your network camera disconnects mid-show, OpenFollow shows a connection-status overlay and reconnects automatically when it’s available again. Two recovery paths run side by side:
- Connect-time failures (bus
ERROR/EOSfrom the input) – fixed-URL inputs (RTSP / SRT / RTP) re-probe the configured URL on Heal interval seconds (default5.0), so a feed that drops during a camera or network reboot recovers on its own once it returns. - Silent mid-stream stalls – a UDP / multicast drop typically delivers no
ERRORand noEOS; the pipeline just stops producing frames. A frame-arrival watchdog rebuilds the input when no decoded frame has arrived within Stall timeout seconds (default3.0). Set to0to disable.
Both timers live at the top of the Video Source form and apply live without a pipeline rebuild.
To force a reconnect without waiting, re-confirm the active source's URL – saving the current URL unchanged rebuilds the pipeline on the spot. A failed rebuild surfaces a banner and rolls the field back.
Latency in practice
End-to-end latency = camera capture → encode → transport → decode → render. The capture+encode buffer in the camera dominates: live-broadcast IP cameras run ~100 ms; surveillance cameras 300–800 ms.
1. NDI® is a registered trademark of Vizrt NDI AB.
2. OpenFollow does not contain any NDI® code by itself. NDI® requires closed source NDI® Tools / NDI® SDK on the host system that need to be installed separately.