Информация о потоках, опубликованных в данный момент на узле, в реальном времени может быть получена при помощи Websocket API.
Получение метрик потока
Для получения метрик определенного потока в реальном времени необходимо:
1. Подключиться к бэкенд-серверу при помощи Websocket API
2. Подписаться на событие /stream/nodeId/mediaId, отправив сообщение
SUBSCRIBE id:sub-2 destination:/stream/3/ca77c700-8e86-11e9-8386-dbc3d191a79a ^@
Здесь:
- 3 - идентификатор узла на бэкенде
- ca77c700-8e86-11e9-8386-dbc3d191a79a - идентификатор медиасессии, в которой опубликован или проигрывается поток
После этого клиент начинает получать STOMP-сообщения вида
MESSAGE destination:/stream/3/ca77c700-8e86-11e9-8386-dbc3d191a79a content-type:application/json;charset=UTF-8 subscription:sub-2 message-id:3-50 content-length:1339 [{"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":1560504548307,"VIDEO_CODEC":119,"VIDEO_NACK":0,"VIDEO_PLI":0,"VIDEO_RATE":581968,"VIDEO_WIDTH":320,"VIDEO_HEIGHT":240,"VIDEO_FPS":31,"timestamp":1560504548318},{"AUDIO_SYNC":1560504548370,"AUDIO_CODEC":111,"AUDIO_RATE":28128,"timestamp":1560504548404,"AUDIO_LOST":0},{"VIDEO_SYNC":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}]
или, при использовании библиотеки STOMP.js
{ "command": "MESSAGE", "headers": { "content-length": "1339", "message-id": "3-50", "subscription": "sub-2", "content-type": "application/json;charset=UTF-8", "destination": "/stream/3/ca77c700-8e86-11e9-8386-dbc3d191a79a" }, "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": 1560504548307, "VIDEO_CODEC": 119, "VIDEO_NACK": 0, "VIDEO_PLI": 0, "VIDEO_RATE": 581968, "VIDEO_WIDTH": 320, "VIDEO_HEIGHT": 240, "VIDEO_FPS": 31, "timestamp": 1560504548318 }, { "AUDIO_SYNC": 1560504548370, "AUDIO_CODEC": 111, "AUDIO_RATE": 28128, "timestamp": 1560504548404, "AUDIO_LOST": 0 }, { "VIDEO_SYNC": 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 } ] }
Сообщения содержат значения метрик, получаемые от узла, на котором опубликован данный поток.
Для того, чтобы перестать получать метрики потока в реальном времени, необходимо отписаться от данных потока, отправив сообщение
UNSUBSCRIBE id:sub-2 ^@
Настройка подключения
Максимальное количество метрик в одном сообщении настраивается при помощи параметра в файле wcsoam.properties
stomp_max_metrics=10
Таймаут соединения настраивается при помощи параметра
stomp_max_timeout=1000
Влияние частоты сбора метрик на частоту получения сообщений
Различные наборы метрик могут собираться на бэкенд-сервере с разной частотой, задаваемой в профиле. Если значение метрики, например, VIDEO_HEIGHT, не изменяется в течение публикации потока, сообщения, содержащие эту метрику, будут приходить подписчику не реже заданной частоты сбора. Если значение метрики меняется (VIDEO_RATE), сообщения, содержащие эту метрику, могут приходить подписчику по факту изменения, но не реже заданной частоты сбора.
Например, если собирать данные потока по профилю, включающему одну статичную метрику VIDEO_WIDTH, с частотой 30
https://hostname:8090/api/profile/create { "name": "profile1", "rate": "30", "metrics": ["2"], "rules": ["1"] }
при максимальном количестве метрик в одном сообщении 1
stomp_max_metrics=1
сообщения будут приходить подписчику приблизительно 1 раз в секунду.
Если указать частоту 600
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
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
https://hostname:8090/api/profile/create { "name": "profile2", "rate": "30", "metrics": ["4","11"], "rules": ["1"] }
при максимальном количестве метрик в одном сообщении 1
stomp_max_metrics=1
для потока, опубликованного на WCS сервер по RTMP, сообщения будут приходить подписчику приблизительно 1-2 раза в секунду.