Skip to content

Camera Management

Cameras are the fundamental entities in Meridian VMS. Each camera represents a single RTSP video stream from an IP camera on your network. Cameras are assigned to a recording server for continuous recording and to a site in the location hierarchy for organisational purposes.

Camera management is accessible from Settings > Cameras & Sites > Cameras in the web interface.

To add a camera manually:

  1. Navigate to Settings > Cameras.
  2. Click Add Camera.
  3. Fill in the required fields:
    • Name — a human-readable label for the camera
    • RTSP URL — the primary stream URL (typically the high-resolution main stream)
    • Location — the site-level location to assign the camera to
  4. Optionally fill in additional fields (see Camera Properties below).
  5. Click Create.

After creation, the management server publishes an add_camera command via MQTT to the assigned recording server. The recorder daemon picks this up and begins streaming and recording the camera within seconds.

Meridian VMS can automatically discover ONVIF-compatible cameras on your network. Discovery operates through the recording servers, which scan their local network segments.

Discovery uses two complementary methods:

WS-Discovery (multicast) : Sends a WS-Discovery probe to the network broadcast address. ONVIF cameras respond with their service endpoints. This works on flat networks where multicast traffic is not filtered.

IP Range Scan : Iterates through a specified IP range and attempts an ONVIF connection on configured ports. This is more reliable across VLANs and subnets where multicast may not reach.

Automated discovery is configured from the Cameras settings page under the discovery section:

Enable Discovery : Master toggle for the scheduled discovery background task.

Discovery Schedule Time : The time of day (24-hour format) when scheduled discovery runs. Default: 03:00.

Discovery Interval (minutes) : How often to re-run discovery after the initial scheduled time. Default: 60 minutes.

IP Range : The network range to scan, in CIDR notation (e.g., 192.168.1.0/24) or as a hyphenated range (e.g., 192.168.1.1-192.168.1.254).

Ports : Comma-separated list of ports to probe. Default: 80,8080. Common ONVIF ports include 80, 8080, and 8899.

Credentials : Default username and password to use when probing cameras. Many cameras ship with admin/admin as default credentials.

When the system discovers a new camera, it creates a discovery record containing:

  • IP address and port
  • Brand and model (if reported by ONVIF)
  • Available stream profiles (resolution, codec)
  • First seen and last seen timestamps

Discovered devices appear in the Cameras settings page. From there you can:

  • Add a discovered device as a camera with pre-populated RTSP URLs and ONVIF host
  • Dismiss a device you do not want to add

Dismissed devices are hidden from the list but are still tracked. If a dismissed device is seen again in a subsequent scan, it remains dismissed.

Each camera record stores the following fields:

FieldDescriptionRequired
nameHuman-readable camera nameYes
rtsp_urlPrimary RTSP stream URL (main stream, high resolution)Yes
rtsp_url_subSub-stream RTSP URL (lower resolution, used for detection)No
onvif_hostONVIF service hostname or IP (e.g., 192.168.1.100)No
usernameCamera credentials usernameNo
passwordCamera credentials passwordNo
FieldDescription
location_idThe site-level location this camera belongs to
server_idThe recording server responsible for this camera

These fields are populated automatically by the recording server when it connects to the camera stream:

FieldDescription
stream_widthVideo width in pixels
stream_heightVideo height in pixels
stream_fpsFrames per second
bitrate_kbpsMeasured bitrate in kilobits per second
FieldDescription
retention_daysPer-camera retention override. When set, this camera’s recordings are retained for the specified number of days instead of the global default.

Each camera has an enabled toggle:

  • Enabled — the camera is active. The recording server streams, records, and runs detection on it.
  • Disabled — the recording server stops all processes for this camera. Existing recordings are preserved.

When you disable a camera, the management server sends a command to the recording server, which gracefully stops recording and releases the stream for that camera.

When you re-enable a camera, an add_camera command is sent and recording resumes.

The camera status is reported by the recording server through its heartbeat every 30 seconds:

StatusMeaning
recordingThe recording engine is actively capturing and the stream is healthy
errorThe camera stream is unreachable or the recording process has failed. The system will attempt to restart automatically.
offlineThe camera is not being processed (disabled or server offline)

Camera status is visible in the Cameras list page, in the location tree sidebar, and on the camera cards in the Live View.

Detection zones allow you to define specific areas within a camera’s field of view where object detection should trigger events. Detections outside of defined zones can be ignored, reducing false positives from areas you are not interested in.

  1. Navigate to Settings > Cameras and select a camera.
  2. Open the Detection Zones panel.
  3. Click Add Zone.
  4. Draw a polygon on the camera snapshot by clicking to place points.
  5. Give the zone a name and optionally set a colour for visual identification.
  6. Click Save.
PropertyDescription
nameA descriptive name for the zone (e.g., “Entrance”, “Parking Lot”)
pointsList of polygon vertices as normalised coordinates (0.0 to 1.0 for both x and y)
enabledToggle to activate or deactivate the zone without deleting it
colorHex colour code for rendering the zone overlay (e.g., #ff0000)
classesPer-zone class filter (see below)

Each detection zone can have its own list of object classes that should trigger events. This allows fine-grained control:

  • Zone “Entrance”: detect person only
  • Zone “Parking Lot”: detect car, truck, bus, motorcycle
  • Zone “Perimeter”: detect person, dog

When a zone’s class filter is set to null (empty), all classes from the server-level detection configuration are active in that zone.

The detection engine evaluates each detection against all enabled zones for that camera. A detection is recorded as an event only if:

  1. The detection’s bounding box centre falls within an enabled zone, and
  2. The detected class is in the zone’s class filter (or the filter is empty, meaning all classes are accepted).

If no zones are defined for a camera, all detections within the frame are accepted.

Camera clock drift can cause timestamps on ONVIF events and motion detection to be inaccurate. Meridian VMS includes a time synchronisation service that syncs camera clocks to the management server’s time via ONVIF.

  1. The management server groups all ONVIF-enabled cameras by their assigned recording server.
  2. For each group, it sends a sync request to the recording server.
  3. The recording server connects to each camera via ONVIF and sets the camera’s system time.
  4. Results are reported back, categorising each camera as synced, already OK, or failed.

Time sync is configured from the Cameras settings page:

Sync camera time daily : Enable or disable the daily automatic sync. When enabled, the sync runs once per day.

Sync Now : Trigger an immediate sync of all cameras. Useful after adding new cameras or after a power outage.

After a sync completes, the UI shows:

  • Number of cameras synced (clock was adjusted)
  • Number already OK (clock was within tolerance)
  • Number failed (camera unreachable or ONVIF error)
  • Total cameras processed

When you delete a camera:

  1. The management server contacts the recording server to delete recording files from disk (best-effort).
  2. All associated records are removed from the database: events, detection zones, recordings, and the camera record itself.
  3. A remove_camera MQTT command is sent to the recording server to stop all processes for that camera.
MethodEndpointDescription
GET/api/camerasList all cameras (supports location_id filter)
POST/api/camerasCreate a new camera
GET/api/cameras/{id}Get a single camera
PATCH/api/cameras/{id}Update camera properties
DELETE/api/cameras/{id}Delete a camera and all associated data
GET/api/cameras/{id}/heatmapGet aggregated heatmap grid
POST/api/cameras/{id}/heatmap/generateGenerate heatmap from historical events