Skip to content

Server-side recordings

ARGUS can record TACLINK video tracks server-side and surfaces them alongside DJI dock media in a single unified tile. The streams tile itself does not have a recording button — recording is triggered from specific players (VMS cameras, drone-stream tile) or by mission-level settings. The results all land in the same Video recordings tile for playback and review.

Where recording actually happens

  • VMS cameras — the VMS player inside the streams tile has its own recording control. Click the record button; VMS service spins up a local-origin recording for that camera.
  • Drone streams — the drone stream tile can record the bound stream. Controlled from inside that tile, not from the streams grid.
  • Mission-wide auto-record — commanders can turn on auto-record at mission level (Mission detail → Configure → Recordings → Auto-record). Every active stream is recorded from that point on; stopping the mission finalises them.
  • DJI dock media — DJI docks produce media during missions (photos + videos during flight tasks). They upload automatically; ARGUS writes dji_media docs.

The streams tile does not have its own “record all” button at the tab level.

The Video recordings tile

Add the Video recordings tile to your layout to see everything — stream recordings + DJI dock media, unified. The component merges two sources:

  • Stream recordings — Firestore records from firebaseApi.listMissionStreamRecordings(missionId). Each has type (drone / bodycam / webcam / survcam), trackId, startedOn, finishedOn, duration, author (senderUser), and any bound asset data.
  • DJI dock media — per-dock list via djiDockService.listMedia(dockSn). Each has fileName, fileType (photo / video), capturedAt, dockSn, and metadata from the dock.

Both sources are sorted together by timestamp. Each row in the tile shows:

  • Source type icon (stream / DJI).
  • Thumbnail (if available).
  • Name or track label.
  • Captured / recorded timestamp.
  • Duration (videos only).
  • File size (DJI media only).
  • Author (stream recordings only).

Playback

Expand a row and an inline <video> player appears. Media URL is resolved lazily:

  • Stream recordings → Firestore Storage URL (short-lived signed URL).
  • DJI media → DJI dock’s media-URL service (similarly short-lived).

Click play. Standard HTML5 video controls. DJI photos render as <img> instead.

Trimming

Not implemented in the current build. You can preview the recording and take a screenshot, but there’s no in-app trim editor. If you need a trimmed export, download the full file and trim externally.

Deleting

Commander-only:

  • Stream recordings — trash icon → confirmation with 3-second cooldown → firebaseApi.deleteStreamRecording(). Doc is removed; the underlying storage file is garbage-collected asynchronously.
  • DJI dock mediadeletion is currently unsupported. DJI’s cloud API doesn’t cleanly expose media-delete without a side-channel. The media stays in ARGUS storage until retention kicks in.

Retention

Default retention for stream recordings + DJI media is 90 days (configurable per org under Admin → Organisation → Defaults). Past the retention window, records are soft-deleted for another 30 days then hard-purged.

File format

  • Stream recordings: WebM (VP8/Opus) or MP4 (H.264/AAC) depending on the source track codec. TACLINK typically produces H.264 so MP4 is the common case.
  • DJI media: whatever the drone writes — usually MP4 for video, JPG for photo.

Codecs are baked in when the recording starts; there’s no in-flight transcode.

Auto-record + mission completion

If the mission has Auto-record enabled:

  • Every stream that appears in the LiveKit room starts recording on join.
  • Streams that end mid-mission produce a short recording capped at that point.
  • On mission completion, all still-recording tracks are finalised within a 60-second grace window, then sealed.

Storage paths

  • Stream recordings land in your org’s S3 media bucket under missions/{missionId}/recordings/{trackId}/{startedOn}.mp4 (or .webm).
  • DJI media land in a DJI-scoped prefix; DJI → media covers the upload pipeline.

Known limitations

  • No trim / edit — full file only.
  • No DJI delete — retention handles cleanup; manual delete not supported.
  • No per-camera auto-record for VMS — auto-record is stream-wide, not per-camera.
  • Single-track recording only — you can’t multi-track (video + separate audio channel) in the current build.