Skip to main content
Skip table of contents

Добавить пoток для захвата или публикации: Stream.Add

Метод и параметры

Добавление потока для захвата или публикации.

string Stream.Add

(uid camera, uid stream, url source, number priority, bool enable, array tracks, object clusterobject dvrobject captureobject liveobject accessobject reconnect).

Параметры

uid camera REQUIRED – уникальный идентификатор камеры в рамках всей инсталляции.


uid stream REQUIRED – уникальный идентификатор потока в рамках камеры.


number priority – приоритет потока в камере. Используется при обработке архива камеры.


url source – RTSP URL захватываемого/публикуемого потока. Если source не указан, то пoток регистрируется, но не обслуживается. Поддерживаются следующие виды схемы URL:

  • rtsp:// – захват RTSP потока по протоколу TCP.

  • tcp:// – аналогично rtsp://.

  • udp:// – захват RTSP потока по протоколу UDP.

  • sink:// – создает точку подключения для публикации потока.


bool enable = true – поток включен.


array tracks = ["audio","video"] – список медиаканалов, которые необходимо захватывать. Если не указан, то всегда будет захватываться video канал.

  • video – захватывать канал видео данных. Захватывается всегда, независимо от настроек. Поддерживаются кодеки H.264, H.265.

  • audio – захватывать канал звука. Если канала нет в исходном RTSP, то канал не создается и не захватывается. Поддерживаются кодеки PCMU, PCMA, MPA, AAC.


object cluster – конфигурация захвата потока в режиме отказоустойчивости.

object cluster

string cluster.primary– имя хоста первичной ноды кластера, захватывающего поток постоянно.


stringcluster.secondary– имя хоста резервной ноды кластера, захватывающего поток в случае недоступности или отказа cluster.primary. Окончание /on обозначает недоступность или отказ cluster.primary хоста, /off или отсутствие постфикса обозначает доступность первичного хоста и нет необходимости захватывать поток.


object dvr – задает параметры записи и хранения архива потока.

object DVR

bytesdvr.buffer1M – размер внутреннего буфера для кеширования операций чтения, записи. Большой объем снижает количество обращений к диску, но увеличивает потребление оперативной памяти.


secondsdvr.duration=1d – указывает длительность хранения DVR в секундах. По истечении установленного срока, архив будет автоматически подчищаться. Изменение параметра длительности хранения может быть как в большую, так и в меньшую сторону.

В значении возможно использовать сокращения: d – дни (пример: 30d), h – часы (пример: 120h), m – минуты (пример:20m).


stringdvr.enable – настройки записи в формате when: mode или week day:offset in seconds: duration in seconds:mode

  • when принимает значения always, never, event:max prev secs:default post secs,

  • mode принимает значения full, part.


stringdvr.locationREQUIRED – если разрешена запись DVR, то данный параметр является обязательным и указывает расположение хранения архива.


bytesdvr.quota = 0G – устанавливает ограничение на объем архива. Если параметр не указан или равен 0, то объем неограничен.

В значении возможно использовать сокращения: G – гигабайт (пример: 30G), M – мегабайт (пример: 120M), K – килобайт (пример: 20K).

В текущей версии данный параметр не накладывает физическое ограничение на объем дискового пространства. Можно использовать как справочный при вызове API.


object capture – определяет параметры захвата.

object capture

stringcapture.enable– настройки захвата в формате when: mode или week day:offset in seconds:duration in seconds:mode

  • when – принимает значения always, never, event:max prev secs:default post secs,

  • mode – принимает значения full, part.


object live – определяет параметры стриминга.

object live

stringlive.enable – настройки стриминга в формате when:mode или week day:offset in seconds:duration in seconds:mode

  • when – принимает значения always, never, event:max prev secs:default post secs,

  • mode – принимает значения full, part.


object access – определяет параметры предоставления доступа к воспроизведению Live и DVR.

object access

enumaccess.allow=private – параметр определяет тип доступа к воспроизведению потока. Поддерживаются следующие виды доступа:

  • public – для доступа к потоку авторизация не требуется.

  • private – требуется авторизация для доступа к потоку. Всегда включена авторизация по OAuth токену. Определен следующий приоритет проверки доступа к потоку:

  1. Задан whitelist и клиент подключается с разрешенного IP – доступ предоставляется без дальнейшей проверки.

  2. Заданы user и password, и клиент успешно авторизовался – доступ предоставляется.

  3. Проверяется OAuth токен, доступ предоставляется если токен верен.


stringaccess.password – пароль для авторизации.


stringaccess.user – имя пользователя веб авторизации.


arrayaccess.whitelist = []– список IP4\IP6 адресов, с которых разрешен доступ без авторизации.


object reconnect – параметры переподключения к потоку при потере или разрыве сетевого соединения.

object reconnect

secondsreconnect.interval = 3s– минимальный таймаут в секундах между попытками подключения к потоку камеры.


secondsreconnect.period=5m – максимальный интервал времени, через который будет осуществляться подключение к камере в случае неудачных последовательных попыток переподключения.


numberreconnect.total10– количество неудачных последовательных попыток подключения, после которых медиасервер перестанет делать очередную попытку переподключения и отметит поток invalid – необслуживаемый. Повторно запустить поток можно только через метод APIStream.Update.

Определена следующая схема переподключения к потоку:

В случае обнаружения разрыва соединения, Mediaserver проверит общее количество неудачных попыток подключения. Если количество равно или превышает reconnect.total, то отметит поток как invalid и прекратит попытки подключения. Если попытки подключения не исчерпаны, то через интервал осуществит попытку подключения. Если попытка удалась, сбросит счетчик ошибок переподключения. В случае неуспешной попытки увеличит счетчик и изменит интервал подключения, прибавив к текущему интервалу значение reconnect.interval. Каждый раз при неуспешной последовательной попытке подключения интервал будет увеличиваться до значения reconnect.period, после чего, до истечения reconnect.total, подключения будут осуществляться через интервал reconnect.period.

Пример:

Если reconnect.interval = 3s, reconnect.period = 180s, то период подключения будет 3,6,9,12 ... 180,180 ... 180


POST /api/

JSON-RPC
JSON
{
    "jsonrpc": "2.0",
    "method": "Stream.Add",
    "params": {
        "camera": "uid",
        "stream": "uid",
        "source": "url",
        "priority": "",
        "enable": true,
        "tracks": [
            "audio",
            "video"
        ],
        "cluster": {
            "primary": "string",
            "secondary": "string"
        },
        "dvr": {
            "enable": "string",
            "location": "string",
            "duration": "1d",
            "quota": "0G",
            "buffer": "1M"
        },
        "capture": {
            "enable": "string"
        },
        "live": {
            "enable": "string"
        },
        "access": {
            "allow": "private",
            "whitelist": [],
            "user": "string",
            "password": "string"
        },
        "reconnect": {
            "interval": "3s",
            "period": "5m",
            "total": 10
        }
    },
    "id": 1
}
cURL
BASH
curl -k --request POST \
	--url 'https://your-domain/api/' \
	--header 'Content-Length: 953' \
	--header 'Content-Type: application/json' \
	--header 'Accept: application/json' \
	--header 'Authorization: Bearer <api-authorization-token>' \
	--header 'Content-Length: <Длина данных>' \
	--data '{
    "jsonrpc": "2.0",
    "method": "Stream.Add",
    "params": {
        "camera": "uid",
        "stream": "uid",
        "source": "url",
        "priority": "",
        "enable": true,
        "tracks": [
            "audio",
            "video"
        ],
        "cluster": {
            "primary": "string",
            "secondary": "string"
        },
        "dvr": {
            "enable": "string",
            "location": "string",
            "duration": "1d",
            "quota": "0G",
            "buffer": "1M"
        },
        "capture": {
            "enable": "string"
        },
        "live": {
            "enable": "string"
        },
        "access": {
            "allow": "private",
            "whitelist": [],
            "user": "string",
            "password": "string"
        },
        "reconnect": {
            "interval": "3s",
            "period": "5m",
            "total": 10
        }
    },
    "id": 1
}'
PHP
PHP
$data = array (
  'jsonrpc' => '2.0',
  'method' => 'Stream.Add',
  'params' => 
  array (
    'camera' => 'uid',
    'stream' => 'uid',
    'source' => 'url',
    'priority' => '',
    'enable' => true,
    'tracks' => 
    array (
      0 => 'audio',
      1 => 'video',
    ),
    'cluster' => 
    array (
      'primary' => 'string',
      'secondary' => 'string',
    ),
    'dvr' => 
    array (
      'enable' => 'string',
      'location' => 'string',
      'duration' => '1d',
      'quota' => '0G',
      'buffer' => '1M',
    ),
    'capture' => 
    array (
      'enable' => 'string',
    ),
    'live' => 
    array (
      'enable' => 'string',
    ),
    'access' => 
    array (
      'allow' => 'private',
      'whitelist' => 
      array (
      ),
      'user' => 'string',
      'password' => 'string',
    ),
    'reconnect' => 
    array (
      'interval' => '3s',
      'period' => '5m',
      'total' => 10,
    ),
  ),
  'id' => 1,
);
$context = stream_context_create([
	'ssl'=>['verify_peer' => false],
	'http' => [
		'method' => 'POST',
		'header' => "Content-Type: application/json\r
Accept: application/json\r
Authorization: Bearer <api-authorization-token>\r
Content-Length: <Длина данных>",
		'content'=>json_encode($data)
	]
]);
$result = file_get_contents('https://your-domain/api/', false, $context);

200 OK

UID камеры, UID добавленного потока

JSON
"<camera-uid>:[<stream-uid>]"

400 Bad Request

Ошибка json-rpc

JSON
{
    "error": {
        "code": -32601,
        "message": "Method not found"
    }
}

500 Internal Server Error

Ошибка сервера

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.