Skip to content

Сессии (сеансы) проигрывания потоков

Здесь мы расскажем, какие сессии существуют во Flussonic и что о них нужно знать.

Когда пользователь начинает смотреть телеканал, он начинает сеанс play в терминологии Flussonic. Когда он переключается на другой канал, это будет уже начало нового сеанса. До версии 21.02 сессии play были единственным видом сессий, которые учитывались через систему событий. Если вы работали с системой авторизации, то этот тип сессий вам знаком.

В версии Flussonic 21.03 появились новые типы сессий:

Мы объединили эти 4 типа сеансов передачи видео (ingest, publish, play, и push) в таблицу:

Инициатор Во Flussonic Из Flussonic
Пользователь publish play
Flussonic ingest push

Жизненный цикл сеанса

У Flussonic есть единый жизненный цикл всех этих видов сессий. Каждый сеанс находится в каком-то состоянии, и переход из одного состояния в другое вызовет какое-то событие.

Для удобства сеансы ingest и publish генерируют события под одним и тем же именем: source.

Пример

  • Пользователь делает первый запрос на поток по HLS. Событие play_opened генерируется при открытии нового сеанса play (событие opened).
  • Бэкэнд авторизации разрешает этот сеанс, поэтому генерируется событие play_authorized.
  • Плеер начинает приём сегментов, этот сеанс превышает пороговое значение и теперь считается started с событием play_started.
  • Пока пользователь смотрит видео, периодически генерируется событие play_updated, которое можно использовать для сохранения информации о сеансе в middleware.
  • По истечении некоторого времени ожидания после последнего запроса сессия считается закрытой с соответствующим событием play_closed.

Cостояния сессии и события

Note

Мы будем именовать состояния сессий с заглавной буквы, а события и типы сессий — со строчной.

Когда сессия открывается, т.е. переходит из состояния None в Establishing, генерируется событие opened. Состояние Establishing означает, что сессия пока ничего ценного не делает, но пытается это делать: подключается, готовится, проверяет авторизацию.

Сессия может закрываться с событием closed, при этом она переходит в состояние Finished.

Сессии вида publish и play в состоянии Establishing и Running могут вызвать событие authorized.

В состоянии Establishing сессия ожидает первый кадр или первый ключевой кадр от источника, если это сессия типа source(ingest/publish), или ожидает передачи достаточного количества байтов, если это сессия типа play/push. Тогда возникнет событие started, и сессия станет Running.

В состоянии Running сессия периодически обновляется (updated), и по этому событию вы можете отслеживать сессию. Используйте событие updated, чтобы обновить запись в базе данных для этой сессии, поскольку оно перезапишет предыдущую информацию об этой сессии.

В состоянии Running сессия может изменяться (altered) при смене входного или выходного битрейта или смене media_info.

В состоянии Running сессия вида play или push может стать overflowed, если не получается передавать данные с требуемой скоростью. А сессия вида source (ingest/publish) может стать overflowed только если протокол передачи видео сообщит об этом, как это делают RTSP/RTCP и SRT.

В состоянии Running сессия может перейти в состояние Stalling с событием stalled, если произошла остановка в передаче данных. Это состояние возникает, если возможен переход обратно в состояние Running (такому переходу соответствует событие recovered).

Сессии, инициированные извне Flussonic (play и publish), должны проходить авторизацию во внешней системе. Эта внешняя система должна отвечаеть на периодические запросы от каждой сессии и должна уметь останавливать сессию (с событием denied).

Данные о сессии

Данные сессий любого типа вы можете получить через API системы событий в виде JSON-объектов, отправленных по HTTP.

Приведём список полей сессии.

Note

Этот список может быть изменен в будущем. Мы постараемся сохранить совместимость как можно дольше, но все должно развиваться. Также Flussonic может передавать дополнительные недокументированные поля. Мы не рекомендуем их использовать, потому что они могут быть изменены или удалены в любой момент.

Имя поля Тип Описание
opened_at integer milliseconds время создания сессии
id string uuid уникальный ID сессии
ip string ip peer IP (IP клиента, источника, push назначения, и т.д.)
proto string protocol протокол доставки видео
media string имя потока или файла
bytes integer переданное число байтов
duration integer milliseconds длительность сессии, не меняется после события closed
user_id string user_id сессии, переданный из auth backend
token string auth token, переданный пользователем

Как использовать новые события

В настройки добавьте директиву notify, например:

notify example {
  sink http://mywebserver/event.php;
  only media=example;
}

stream example {
  url tshttp://127.0.0.1/fake/mpegts;
}

Эта конфигурация будет отправлять HTTP POST запросы с телом JSON, содержащим сеансы, описанные на странице выше. Необработанные сообщения слишком большие, чтобы приводить их здесь, но покажем лишь некоторые из них.

Cобытия подключения к источнику

В примере вы можете видеть ряд событий при подключении Flussonic к источнику:

  • source_connected, старт HTTP соединения ("status":"http_connect").

  • source_started, создаётся source_id=7ad153b1-68a5-4304-bbfd-b136603baebd.

  • stream_updated, обновление bytes, bytes_out для source_id=7ad153b1-68a5-4304-bbfd-b136603baebd.

[{
  "event":"source_connected",
  "event_id":1023,
  "id":"4f3c7cec-5c36-4670-921b-a0dcd4a6f0c8",
  "loglevel":"info",
  "media":"example",
  "priority":1,
  "proto":"tshttp",
  "server":"mk1.e",
  "status":{"status":"http_connect"},
  "url":"tshttp://127.0.0.1/fake/mpegts",
  "utc_ms":1614524093408
 },{
  "dts":93606612.44444445,
  "event":"source_started",
  "event_id":1027,
  "id":"4f3c7cec-5c36-4670-921b-a0dcd4a6f0c8",
  "loglevel":"info",
  "media":"example",
  "priority":1,
  "proto":"tshttp",
  "server":"mk1.e",
  "source_id":"7ad153b1-68a5-4304-bbfd-b136603baebd",
  "url":"tshttp://127.0.0.1/fake/mpegts",
  "utc_ms":1614524093414
 },{
  "bytes":0,
  "bytes_out":0,
  "event":"stream_updated",
  "event_id":1028,
  "id":"82c59180-e64e-42fc-8f11-2dec111ca5f7",
  "loglevel":"debug",
  "media":"example",
  "opened_at":1614524093399,
  "server":"mk1.e",
  "source_id":"4f3c7cec-5c36-4670-921b-a0dcd4a6f0c8",
  "utc_ms":1614524093415
  }]

Событие начала проигрывания

Вы получите событие play_opened, когда клиент подключится к потоку по HLS:

  [{
    "bytes":0,
    "country":null,
    "event":"play_opened",
    "event_id":1064,
    "id":"24b79b95-7400-4da2-bf9c-a855603baed1",
    "ip":"192.168.100.7",
    "loglevel":"debug",
    "media":"example",
    "opened_at":1614524113129,
    "proto":"hls",
    "query_string":"token=test",
    "referer":null,
    "server":"mk1.e",
    "source_id":"82c59180-e64e-42fc-8f11-2dec111ca5f7",
    "token":"test","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36",
    "user_id":null,
    "user_name":"example",
    "utc_ms":1614524113129
   }]

Обратим внимание, что "source_id":"82c59180-e64e-42fc-8f11-2dec111ca5f7" это тот же ID, что в предыдущем примере. Все события связаны посредством параметра source_id.