...
Информация о потоках, опубликованных в данный момент на узле, в реальном времени может быть получена по протоколу STOMP поверх при помощи Websocket API.
Подключение к бэкенд-серверу по STOMP через Websocket
...
Получение метрик потока
Для получения метрик определенного потока в реальном времени необходимо:
1. Установить Secure Websocket соединение по адресу https://hostname:8090/ws, где hostname – имя бэкенд-сервера
2. Установить соединение по протоколу STOMP, отправив сообщение
Code Block | ||
---|---|---|
| ||
CONNECT
accept-version:1.2
host:hostname
^@ |
3.Подключиться к бэкенд-серверу при помощи Websocket API
2. Подписаться на событие /stream/nodeId/mediaId, отправив сообщение
Code Block | ||
---|---|---|
| ||
SUBSCRIBE id:sub-12 destination:/stream/153/010934f0ca77c700-07668e86-11e9-a9508386-59983a9de3c8dbc3d191a79a ^@ |
Здесь:15
- 3 - идентификатор узла на бэкенде
...
- ca77c700-
...
- 8e86-11e9-
...
- 8386-
...
- dbc3d191a79a - идентификатор медиасессии, в которой опубликован или проигрывается поток
4. Подписаться на событие /alarm для получения тревог (см ниже)
Code Block | ||
---|---|---|
| ||
SUBSCRIBE
id:sub-0
destination:/alarm
^@ |
После этого клиент начинает получать STOMP-сообщения вида
Code Block | ||
---|---|---|
| ||
"MESSAGE\ndestination destination:/stream/153/010934f0ca77c700-07668e86-11e9-a950-59983a9de3c8\ncontent8386-dbc3d191a79a content-type:application/json;charset=UTF-8\nsubscription subscription:sub-1\nmessage2 message-id:oilwo0os-701\ncontent3-50 content-length:1349\n\n1339 [{\"VIDEO_SYNC\":37546371251971560504547907,\"VIDEO_CODEC\":120119,\"VIDEO_NACK\":180,\"VIDEO_PLI\":0,\"VIDEO_RATE\":478104571616,\"VIDEO_WIDTH\":320,\"VIDEO_HEIGHT\":240,\"VIDEO_FPS\":30,\"timestamp\":15456483255061560504547917},{\"AUDIO_SYNC\":37546371252271560504547890,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":3261626664,\"timestamp\":15456483255581560504547923,\"AUDIO_LOST\":210},{\"AUDIO_SYNC\":37546371253471560504548010,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":3296027040,\"timestamp\":15456483256841560504548040,\"AUDIO_LOST\":210},{\"VIDEO_SYNC\":37546371253971560504548099,\"VIDEO_CODEC\":120119,\"VIDEO_NACK\":180,\"VIDEO_PLI\":0,\"VIDEO_RATE\":504632577416,\"VIDEO_WIDTH\":320,\"VIDEO_HEIGHT\":240,\"VIDEO_FPS\":3130,\"timestamp\":15456483257011560504548119},{\"AUDIO_SYNC\":37546371254671560504548130,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":3304826624,\"timestamp\":15456483258051560504548167,\"AUDIO_LOST\":210},{\"VIDEOAUDIO_SYNC\":37546371255971560504548250,\"VIDEOAUDIO_CODEC\":120111,\"VIDEO_NACK\AUDIO_RATE":27976,"timestamp":181560504548282,\"VIDEOAUDIO_PLI\LOST":0},\{"VIDEO_RATE\SYNC":4956241560504548307,\"VIDEO_WIDTH\CODEC":320119,\"VIDEO_HEIGHT\NACK":2400,\"VIDEO_FPS\PLI":300,\"timestamp\VIDEO_RATE":1545648325911}581968,{\"AUDIOVIDEO_SYNC\WIDTH":3754637125587320,\"AUDIOVIDEO_CODEC\HEIGHT":111240,\"AUDIOVIDEO_RATE\FPS":3304831,\"timestamp\":1545648325921,\"AUDIO_LOST\":211560504548318},{\"AUDIO_SYNC\":37546371257071560504548370,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":3240028128,\"timestamp\":15456483260491560504548404,\"AUDIO_LOST\":210},{\"VIDEO_SYNC\":37546371257961560504548499,\"VIDEO_CODEC\":120119,\"VIDEO_NACK\":180,\"VIDEO_PLI\":0,\"VIDEO_RATE\":480224583032,\"VIDEO_WIDTH\":320,\"VIDEO_HEIGHT\":240,\"VIDEO_FPS\":3231,\"timestamp\":15456483261041560504548506},{\"AUDIO_SYNC\":37546371258271560504548490,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":3304829568,\"timestamp\":15456483261591560504548522,\"AUDIO_LOST\":210}]\u0000" |
или, при использовании библиотеки STOMP.js
Code Block | ||||
---|---|---|---|---|
| ||||
{ "command": "MESSAGE", "headers": { "content-length": "12821339", "message-id": "oilwo0os3-92650", "subscription": "sub-12", "content-type": "application/json;charset=UTF-8", "destination": "/stream/153/010934f0ca77c700-07668e86-11e9-a9508386-59983a9de3c8dbc3d191a79a" }, "body": [ { { "VIDEO_SYNC": 1560504547907, "VIDEO_CODEC": 119, "VIDEO_NACK": 0, "VIDEO_PLI": 0, "VIDEO_RATE": 571616, "VIDEO_WIDTH": 320, "VIDEO_HEIGHT": 240, "VIDEO_FPS": 30, "timestamp": 1560504547917 }, { "AUDIO_SYNC": 1560504547890, "AUDIO_CODEC": 111, "AUDIO_RATE": 26664, "timestamp": 1560504547923, "AUDIO_LOST": 0 }, { "AUDIO_SYNC": 1560504548010, "AUDIO_CODEC": 111, "AUDIO_RATE": 27040, "timestamp": 1560504548040, "AUDIO_LOST": 0 }, { "VIDEO_SYNC": 1560504548099, "VIDEO_CODEC": 119, "VIDEO_NACK": 0, "VIDEO_PLI": 0, "VIDEO_RATE": 577416, "VIDEO_WIDTH": 320, "VIDEO_HEIGHT": 240, "VIDEO_FPS": 30, "timestamp": 1560504548119 }, { "AUDIO_SYNC": 1560504548130, "AUDIO_CODEC": 111, "AUDIO_RATE": 26624, "timestamp": 1560504548167, "AUDIO_LOST": 0 }, { "AUDIO_SYNC": 1560504548250, "AUDIO_CODEC": 111, "AUDIO_RATE": 27976, "timestamp": 1560504548282, "AUDIO_LOST": 0 }, { "VIDEO_SYNC": 37546372991701560504548307, "VIDEO_CODEC": 120119, "VIDEO_NACK": 200, "VIDEO_PLI": 0, "VIDEO_RATE": 617024581968, "VIDEO_WIDTH": 320, "VIDEO_HEIGHT": 240, "VIDEO_FPS": 2431, "timestamp": 1545648499723 1560504548318 }, { "AUDIO_SYNC": 37546372994821560504548370, "AUDIO_CODEC": 111, "AUDIO_RATE": 3060028128, "timestamp": 15456484997991560504548404, "AUDIO_LOST": 0 }, { "VIDEO_SYNC": 23 }, ... 1560504548499, "VIDEO_CODEC": 119, "VIDEO_NACK": 0, "VIDEO_PLI": 0, "VIDEO_RATE": 583032, "VIDEO_WIDTH": 320, "VIDEO_HEIGHT": 240, "VIDEO_FPS": 31, "timestamp": 1560504548506 }, { "AUDIO_SYNC": 1560504548490, "AUDIO_CODEC": 111, "AUDIO_RATE": 29568, "timestamp": 1560504548522, "AUDIO_LOST": 0 } ] } |
Сообщения содержат значения метрик, получаемые от узла, на котором опубликован данный поток.
...
Code Block | ||
---|---|---|
| ||
UNSUBSCRIBE id:/stream/15/010934f0-0766-11e9-a950-59983a9de3c8sub-2 ^@ |
Настройка подключения
Максимальное количество метрик в одном сообщении настраивается при помощи параметра в файле wcsoam.properties
Code Block | ||
---|---|---|
| ||
stomp_max_metrics=10 |
Метрики отправляются подписчику, когда число изменившихся метрик достигнет заданного значения. Таким образом, если метрики меняются редко, целесообразно уменьшить данный параметр.
...
Таймаут соединения настраивается при помощи параметра
Code Block | ||
---|---|---|
| ||
stomp_max_timeout=1000 |
Влияние частоты сбора метрик на частоту получения сообщений
Различные наборы метрик могут собираться на бэкенд-сервере с разной частотой, задаваемой в профиле. Если значение метрики, например, VIDEO_HEIGHT, не изменяется в течение публикации потока, сообщения, содержащие эту метрику, будут приходить подписчику не реже заданной частоты сбора. Если значение метрики меняется (VIDEO_RATE), сообщения, содержащие эту метрику, могут приходить подписчику по факту изменения, но не реже заданной частоты сбора.
Например, если собирать данные потока по профилю, включающему одну статичную метрику VIDEO_WIDTH, с частотой 30
Code Block | ||||
---|---|---|---|---|
| ||||
https://hostname:8090/api/profile/create
{
"name": "profile1",
"rate": "30",
"metrics": ["2"],
"rules": ["1"]
} |
при максимальном количестве метрик в одном сообщении 1
Code Block | ||
---|---|---|
| ||
stomp_max_metrics=1 |
сообщения будут приходить подписчику приблизительно 1 раз в секунду.
Если указать частоту 600
Code Block | ||||
---|---|---|---|---|
| ||||
https://hostname:8090/api/profile/update
{
"id": "2",
"name": "profile1",
"rate": "600",
"metrics": ["2"],
"rules": ["1"]
} |
сообщения будут приходить подписчику приблизительно 1 раз в 20 секунд.
Если теперь расширить набор метрик до 4 статических VIDEO_WIDTH, VIDEO_HEIGHT, VIDEO_CODEC, AUDIO_CODEC
Code Block | ||||
---|---|---|---|---|
| ||||
https://hostname:8090/api/profile/update
{
"id": "2",
"name": "profile1",
"rate": "600",
"metrics": ["2","3","9","13"],
"rules": ["1"]
} |
сообщения будут приходить подписчику приблизительно 1 раз в 5 секунд.
Если собирать данные по профилю, включающему две метрики VIDEO_RATE, AUDIO_RATE, с частотой 30
Code Block | ||||
---|---|---|---|---|
| ||||
https://hostname:8090/api/profile/create
{
"name": "profile2",
"rate": "30",
"metrics": ["4","11"],
"rules": ["1"]
} |
при максимальном количестве метрик в одном сообщении 1
Code Block | ||
---|---|---|
| ||
stomp_max_timeout=1000metrics=1 |
для потока, опубликованного на WCS сервер по RTMP, сообщения будут приходить подписчику приблизительно 1-2 раза в секунду.