Camera stream tile
The Camera stream tile is a dedicated full-tile view for a single non-drone video source — a bodycam, phone camera, worn camera, or any other non-aircraft track published into the TACLINK room. It’s distinct from both the streams grid (which shows everything) and the drone-stream tile (which handles aircraft).
When to use it
Use this tile when you want a dedicated region of the layout for an on-person camera and don’t need the drone-specific overlays (HUD, sensor fusion, detection boxes). Typical set-up: one region has the drone-stream tile on the mission’s primary aircraft; another has the camera-stream tile on the incident commander’s bodycam.
Binding to a peer + track
The tile takes two @Inputs:
- peerId — the LiveKit participant identity of the source.
- trackId — the video track within that peer. Defaults to
VIDEO_CAMERA_TRACK_ID(the conventional track ID for non-drone cameras).
Set them in the settings drawer’s Tiles section — the dropdown lists every active non-drone track and assigns both fields in one click.
Once bound, the tile pulls stream.stream from statusSig().video.streams
matching the peer+track and renders it with the appVideoSrcObject directive
(which sets the srcObject property on the <video>).
Cycling between non-drone sources
If you have multiple bodycams + phone cameras + worn cameras running, the tile shows chevron buttons to cycle only non-drone streams. Drone streams are excluded from the cycle so the tile never accidentally rebinds to a drone.
- Prev / Next buttons in the tile header.
- Position indicator
N / totalshows where you are in the cycle. - Wrap-around at ends.
When the peer changes via cycling, the tile emits a peerChanged event so the
parent can persist the new binding — this is how your selection survives a
refresh.
Controls in the tile
- Peer label — shows the speaker’s display name, with an optional secondary label (callsign) below.
- Stream type badge — “Camera” or “Bodycam” (depending on what the source published).
- Debug latency (debug mode only) — milliseconds from
RTCPeerConnection.getStats(), polled every 2 seconds.
There are no play/pause/mute controls on the tile itself — the video is
autoplay muted by design, and muting/volume should happen at the system level
(you’re mixing operator audio separately through the PTT widget, not the camera
audio).
Differences from the VMS camera player
| Aspect | Camera stream tile | VMS camera player |
|---|---|---|
| Source | WebRTC peer (live mission track) | IP camera URL (HLS / MJPEG / MP4 / Embed) |
| Storage | Not stored — pure live | Can be server-recorded |
| Geolocation | From peer’s mapped position | From the VMS camera’s configured lat/lng |
| PTZ | No | Yes if ONVIF / HTTP PTZ configured |
| Use case | Operator-worn / phone / bodycam | Fixed-installed CCTV |
Differences from the drone stream tile
| Aspect | Camera stream tile | Drone stream tile |
|---|---|---|
| Overlays | None — plain video | HUD, AI detections, AR, SAM, SVS, flags, joystick overlay |
| Cycling | Non-drone streams only | Drone streams only, including secondary lens tracks |
| Controls | None | Lens / quality / camera / PIP / record |
| Transport | Pure TACLINK | TACLINK or DJI Cloud |
Known limitations
- Single track only — there’s no picture-in-picture for a second camera on the same peer (rare use case, but notable if you have a helmet-cam that publishes two angles simultaneously).
- No recording from the tile — record at the mission level or from the VMS side if the source is a fixed camera.
- No snapshot button — take screenshots via OS-level screenshot tools.
Related
- Streams overview
- TACLINK tab — where non-drone peers surface.
- VMS cameras — for fixed IP cameras.
- Drone stream tile — for aircraft tracks.