Перейти к содержанию

Получение информации о потоках в реальном времени

Информация о потоках, опубликованных в данный момент на узле, в реальном времени может быть получена при помощи 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}]

или в JSON, при использовании библиотеки 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 раза в секунду.