Add а stream: Stream.Add

Adds a new stream with the specified configuration.

Parameters

params: object


params.camera: Uid aka string

Pattern: ^[a-zA-Z0-9_-]+$

Unique identifier used throughout the system

Unique camera identifier within the installation


params.streams: StreamsObject aka object

Map of stream configurations keyed by stream identifier

Stream configuration parameters for the camera

params.streams...

params.streams{}: StreamConfig aka object

Complete stream configuration for a camera


params.streams{}.source: Url aka string

Pattern: ^(?:https|file|rtsp|tcp|udp|sink|sync)://[[:graph:]]+$

Valid URL string

RTSP URL of the camera stream


params.streams{}.enable: null|boolean

optional nullable

Whether the camera/stream is enabled


params.streams{}.camera: Uid aka string

Pattern: ^[a-zA-Z0-9_-]+$

Unique identifier used throughout the system

Unique camera identifier


params.streams{}.priority: null|integer

optional nullable

Stream priority


params.streams{}.secure: null|string

optional nullable

Default:

JSON
""

Stream security key used to encrypt the stream


params.streams{}.device: null|string

optional nullable

No description


params.streams{}.dvr: DvrObject aka null|object

optional nullable

DVR recording and storage configuration

DVR recording configuration


params.streams{}.dvr.enable: EnableObject aka null|string|boolean|array

optional nullable

One of 3 variants

Whether DVR recording is enabled


params.streams{}.dvr.enable<0>: EnableString aka string

Pattern: ((always|never|event:([0-9]+):([0-9]+))?(:(full|part))?)

No description


params.streams{}.dvr.enable<1>: EnableArray aka array

No description


params.streams{}.dvr.enable<1>[]: string

Pattern: (((monday|tuesday|wednesday|thursday|friday|saturday|sunday):([0-9]+):([0-9]+))?(:(full|part))?)

No description


params.streams{}.dvr.enable<2>: boolean

No description


params.streams{}.dvr.location: Url aka null|string

optional nullable

Pattern: ^(?:https|file|rtsp|tcp|udp|sink|sync)://[[:graph:]]+$

Valid URL string

Storage location for DVR archive (required if DVR is enabled)


params.streams{}.dvr.duration: integer

optional

Default:

JSON
120

Archive retention duration - older recordings are automatically cleaned up


params.streams{}.dvr.buffer: ByteSize aka string

optional

Pattern: ^[0-9]+(G|M|K)$

Default:

JSON
"1M"

Byte size with unit suffixes (G=gigabytes, M=megabytes, K=kilobytes)

Internal buffer size for caching read/write operations


params.streams{}.dvr.quota: ByteSize aka string

optional

Pattern: ^[0-9]+(G|M|K)$

Default:

JSON
"0G"

Byte size with unit suffixes (G=gigabytes, M=megabytes, K=kilobytes)

Archive storage size limit (0 = unlimited)


params.streams{}.capture: CaptureObject aka null|object

optional nullable

Stream capture configuration


params.streams{}.capture.enable: EnableObject aka null|string|boolean|array

optional nullable

One of 3 variants

Whether stream capture is enabled


params.streams{}.capture.enable<0>: EnableString aka string

Pattern: ((always|never|event:([0-9]+):([0-9]+))?(:(full|part))?)

No description


params.streams{}.capture.enable<1>: EnableArray aka array

No description


params.streams{}.capture.enable<1>[]: string

Pattern: (((monday|tuesday|wednesday|thursday|friday|saturday|sunday):([0-9]+):([0-9]+))?(:(full|part))?)

No description


params.streams{}.capture.enable<2>: boolean

No description


params.streams{}.live: LiveObject aka null|object

optional nullable

Stream live configuration


params.streams{}.live.enable: EnableObject aka null|string|boolean|array

optional nullable

One of 3 variants

Whether live streaming is enabled


params.streams{}.live.enable<0>: EnableString aka string

Pattern: ((always|never|event:([0-9]+):([0-9]+))?(:(full|part))?)

No description


params.streams{}.live.enable<1>: EnableArray aka array

No description


params.streams{}.live.enable<1>[]: string

Pattern: (((monday|tuesday|wednesday|thursday|friday|saturday|sunday):([0-9]+):([0-9]+))?(:(full|part))?)

No description


params.streams{}.live.enable<2>: boolean

No description


params.streams{}.access: AccessObject aka null|object

optional nullable

Access control parameters for live and DVR playback

Access control parameters for playback


params.streams{}.access.allow: AccessType aka null|string

optional nullable

One of: private, public

Type of access control for stream playback

Access control type


params.streams{}.access.password: string

optional

Default:

JSON
"admin"

Authentication password


params.streams{}.access.user: string

optional

Default:

JSON
"admin"

Authentication username


params.streams{}.access.whitelist: array

optional

Default:

JSON
[]

List of IP addresses allowed access without authentication

IP whitelist for unauthorized access


params.streams{}.access.whitelist[]: IpAddress aka string

Pattern: ^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$|^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$

IPv4 or IPv6 address


params.streams{}.tracks: array

optional

Default:

JSON
[
  "video",
  "audio"
]

Media channels to capture from the stream

List of media tracks to capture


params.streams{}.tracks[]: TrackType aka string

One of: video, audio, application

Media track types that can be captured from RTSP stream


params.streams{}.sensor: null|object

optional nullable

Default:

JSON
{}

No description


params.streams{}.sensor{}: string

No description


params.streams{}.reconnect: ReconnectParams aka null|object

optional nullable

Stream reconnection parameters for handling network connection failures

Stream reconnection parameters


params.streams{}.reconnect.interval: integer

optional

Default:

JSON
10

Minimum timeout in seconds between stream connection attempts


params.streams{}.reconnect.period: integer

optional

Default:

JSON
1800

Maximum time interval for connection attempts during consecutive failures


params.streams{}.reconnect.total: integer

optional

Default:

JSON
500

Number of consecutive failed attempts before marking stream as invalid


params.streams{}.reconnect.timeout: integer

optional

Default:

JSON
10

Reconnection timeout in seconds


params.streams{}.timeout: null|boolean

optional nullable

Default:

JSON
false

No description


params.streams{}.cluster: ClusterObject aka object

Failover cluster configuration for stream capture

Cluster failover configuration


params.streams{}.cluster.primary: string

Hostname of primary cluster node that captures the stream continuously


params.streams{}.cluster.spare: null|string

optional nullable

Hostname of secondary cluster node that captures the stream


params.streams{}.modify: ModifyObject aka null|object

optional nullable

Modify configuration for stream spoiling

Modify configuration to explicitly spoil RTSP stream (for testing only)


params.streams{}.modify.frame_drop: number

optional

Default:

JSON
0.0

Drop each `frame_drop` frame


params.streams{}.modify.cycle_drop: number

optional

Default:

JSON
0.0

Drop each `cycle_drop` frame


params.streams{}.modify.duplication: number

optional

Default:

JSON
0.0

Duplicate each `duplication` frame


params.streams{}.modify.permutation: number

optional

Default:

JSON
0.0

Permutate each `permutation` frame


params.streams{}.modify.corruption: number

optional

Default:

JSON
0.0

Corrupt each `corruption` frame


params.streams{}.modify.zeroing: number

optional

Default:

JSON
0.0

Zeroing each `zeroing` frame


params.streams{}.modify.truncation: number

optional

Default:

JSON
0.0

Truncate each `truncation` frame


params.streams{}.modify.delay_dispersion: array

Delay frame streaming in the dispersion range


params.streams{}.modify.delay_dispersion[]: integer

No description



Result

result: object

Map of camera and streams UIDs to add status


result{}: object

No description

result{}...

result{}{}: boolean

No description



POST /api/

JSON
{
  "jsonrpc": "2.0",
  "method": "Stream.Add",
  "params": {
    "camera": "camera_uuid",
    "streams": {
      "camera_uuid": {
        "access": {
          "allow": "private",
          "whitelist": []
        },
        "camera": "camera_uuid",
        "reconnect": {
          "interval": 10,
          "period": 1800,
          "total": 500
        },
        "capture": {
          "enable": "always:full"
        },
        "cluster": {
          "primary": ""
        },
        "dvr": {
          "enable": "always:full",
          "location": "file:////storage/",
          "duration": 180,
          "buffer": "1M",
          "quota": "0G"
        },
        "live": {
          "enable": "never"
        },
        "enable": true,
        "source": "rtsp://admin:123_Camera@192.168.204.17:554/media/video0",
        "tracks": [
          "video"
        ]
      }
    }
  },
  "id": 123
}
cURL
Bash
curl -k --request POST \
    --url 'https://your-domain/api/' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer <api-authorization-token>' \
    --data '{
  "jsonrpc": "2.0",
  "method": "Stream.Add",
  "params": {
    "camera": "camera_uuid",
    "streams": {
      "camera_uuid": {
        "access": {
          "allow": "private",
          "whitelist": []
        },
        "camera": "camera_uuid",
        "reconnect": {
          "interval": 10,
          "period": 1800,
          "total": 500
        },
        "capture": {
          "enable": "always:full"
        },
        "cluster": {
          "primary": ""
        },
        "dvr": {
          "enable": "always:full",
          "location": "file:////storage/",
          "duration": 180,
          "buffer": "1M",
          "quota": "0G"
        },
        "live": {
          "enable": "never"
        },
        "enable": true,
        "source": "rtsp://admin:123_Camera@192.168.204.17:554/media/video0",
        "tracks": [
          "video"
        ]
      }
    }
  },
  "id": 123
}'

200 OK

JSON
{
  "jsonrpc": "2.0",
  "result": {
    "camera_uuid": {
      "stream_uuid": true
    }
  },
  "id": 123
}

400 Bad Request

JSON
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32601,
    "message": "Method not found"
  },
  "id": 123
}

500 Internal Server Error

Server error