Информация о потоках, опубликованных в данный момент на узле, в реальном времени может быть получена по протоколу STOMP поверх Websocket API.
Подключение к бэкенд-серверу по STOMP через Websocket
Для подключения к бэкенд-серверу для получения метрик в реальном времени необходимо:
1. Установить Secure Websocket соединение по адресу https://hostname:8090/ws, где hostname – имя бэкенд-сервера
2. Установить соединение по протоколу STOMP, отправив сообщение
CONNECT accept-version:1.2 host:hostname ^@
3. Подписаться на событие /stream/nodeId/mediaId, отправив сообщение
SUBSCRIBE id:sub-1 destination:/stream/15/010934f0-0766-11e9-a950-59983a9de3c8 ^@
Здесь
15 - идентификатор узла на бэкенде
010934f0-0766-11e9-a950-59983a9de3c8 - идентификатор медиасессии, в которой опубликован или проигрывается поток
4. Подписаться на событие /alarm для получения тревог (см ниже)
SUBSCRIBE id:sub-0 destination:/alarm ^@
После этого клиент начинает получать STOMP-сообщения вида
"MESSAGE\ndestination:/stream/15/010934f0-0766-11e9-a950-59983a9de3c8\ncontent-type:application/json;charset=UTF-8\nsubscription:sub-1\nmessage-id:oilwo0os-701\ncontent-length:1349\n\n[{\"VIDEO_SYNC\":3754637125197,\"VIDEO_CODEC\":120,\"VIDEO_NACK\":18,\"VIDEO_PLI\":0,\"VIDEO_RATE\":478104,\"VIDEO_WIDTH\":320,\"VIDEO_HEIGHT\":240,\"VIDEO_FPS\":30,\"timestamp\":1545648325506},{\"AUDIO_SYNC\":3754637125227,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":32616,\"timestamp\":1545648325558,\"AUDIO_LOST\":21},{\"AUDIO_SYNC\":3754637125347,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":32960,\"timestamp\":1545648325684,\"AUDIO_LOST\":21},{\"VIDEO_SYNC\":3754637125397,\"VIDEO_CODEC\":120,\"VIDEO_NACK\":18,\"VIDEO_PLI\":0,\"VIDEO_RATE\":504632,\"VIDEO_WIDTH\":320,\"VIDEO_HEIGHT\":240,\"VIDEO_FPS\":31,\"timestamp\":1545648325701},{\"AUDIO_SYNC\":3754637125467,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":33048,\"timestamp\":1545648325805,\"AUDIO_LOST\":21},{\"VIDEO_SYNC\":3754637125597,\"VIDEO_CODEC\":120,\"VIDEO_NACK\":18,\"VIDEO_PLI\":0,\"VIDEO_RATE\":495624,\"VIDEO_WIDTH\":320,\"VIDEO_HEIGHT\":240,\"VIDEO_FPS\":30,\"timestamp\":1545648325911},{\"AUDIO_SYNC\":3754637125587,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":33048,\"timestamp\":1545648325921,\"AUDIO_LOST\":21},{\"AUDIO_SYNC\":3754637125707,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":32400,\"timestamp\":1545648326049,\"AUDIO_LOST\":21},{\"VIDEO_SYNC\":3754637125796,\"VIDEO_CODEC\":120,\"VIDEO_NACK\":18,\"VIDEO_PLI\":0,\"VIDEO_RATE\":480224,\"VIDEO_WIDTH\":320,\"VIDEO_HEIGHT\":240,\"VIDEO_FPS\":32,\"timestamp\":1545648326104},{\"AUDIO_SYNC\":3754637125827,\"AUDIO_CODEC\":111,\"AUDIO_RATE\":33048,\"timestamp\":1545648326159,\"AUDIO_LOST\":21}]\u0000"
или, при использовании библиотеки STOMP.js
{ "command": "MESSAGE", "headers": { "content-length": "1282", "message-id": "oilwo0os-926", "subscription": "sub-1", "content-type": "application/json;charset=UTF-8", "destination": "/stream/15/010934f0-0766-11e9-a950-59983a9de3c8" }, "body": [ { "VIDEO_SYNC": 3754637299170, "VIDEO_CODEC": 120, "VIDEO_NACK": 20, "VIDEO_PLI": 0, "VIDEO_RATE": 617024, "VIDEO_WIDTH": 320, "VIDEO_HEIGHT": 240, "VIDEO_FPS": 24, "timestamp": 1545648499723 }, { "AUDIO_SYNC": 3754637299482, "AUDIO_CODEC": 111, "AUDIO_RATE": 30600, "timestamp": 1545648499799, "AUDIO_LOST": 23 }, ... ] }
Сообщения содержат значения метрик, получаемые от узла, на котором опубликован данный поток.
Для того, чтобы перестать получать метрики потока в реальном времени, необходимо отписаться от данных потока, отправив сообщение
UNSUBSCRIBE id:/stream/15/010934f0-0766-11e9-a950-59983a9de3c8 ^@
Настройка подключения
Максимальное количество метрик в одном сообщении настраивается при помощи параметра в файле 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": ["1"], "rules": ["1"] }
при максимальном количестве метрик в одном сообщений 1
stomp_max_metrics=1
сообщения будут приходить подписчику приблизительно 1 раз в секунду.
Если указать частоту 600
https://hostname:8090/api/profile/update { "id": "2", "name": "profile1", "rate": "600", "metrics": ["1"], "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": ["1","2","8","12"], "rules": ["1"] }
сообщения будут приходить подписчику приблизительно 1 раз в 5 секунд.
Если собирать данные по профилю, включающему две метрики VIDEO_RATE, AUDIO_RATE, с частотой 30
https://hostname:8090/api/profile/create { "name": "profile2", "rate": "30", "metrics": ["3","10"], "rules": ["1"] }
при максимальном количестве метрик в одном сообщений 1
stomp_max_metrics=1
для потока, опубликованного на WCS сервер по RTMP, сообщения будут приходить подписчику приблизительно 1-2 раза в секунду.