OpenFollow Preview

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

SourceWhen to use itLatency
SRTIf you have no other options and an unreliable network2–3 frames (professional cameras)
RTPTightly-controlled local pipelines you generate yourselfVaries widely; can be very low
NDI® 1 2NDI®-native cameras and software sourcesTypically 5–7 frames
Pi Camera (CSI)Pi Camera modules, CSI capture adaptersLowest overall (no network)
USB CameraUVC webcams, USB capture cardsVaries by vendor
Media GalleryBench testing without a camera; play a stored still or clipn/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.

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 / EOS from the input) – fixed-URL inputs (RTSP / SRT / RTP) re-probe the configured URL on Heal interval seconds (default 5.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 ERROR and no EOS; the pipeline just stops producing frames. A frame-arrival watchdog rebuilds the input when no decoded frame has arrived within Stall timeout seconds (default 3.0). Set to 0 to 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.