Skip to content

Интеграция сторонней видеоаналитики

Flussonic Watcher позволяет подключить стороннюю видео аналитику. Это позволит:

  • хранить эпизоды видео с нужными событиями стандартным механизмом DVR
  • искать, просматривать, выгружать внешние события вместе со стандартными событиями аналитики Watcher
  • передавать внешние события в другие системы наравне с остальными данными

В целом события от сторонней аналитики интегрируются наравне с внутренними.

Для этого необходимо:

  • Забрать видео поток по RTSP (если аналитика вообще основана на видео, а не является работой другого датчика)
  • Найти необходимые события на видео
  • Основываясь на таймстемпах в RTSP прислать в Watcher эпизоды с этими событиями

RTSP для аналитики

Забирать видео можно по разным протоколам, но абсолютную адресацию времени, подходящую для идентификации кадра поддерживает протокол RTSP, а он стандартный для IP видеонаблюдения, поэтому мы рекомендуем использовать его.

Наш опыт работы с RTSP с камер наблюдения говорит о том, что точности этого протокола хватает для покадровой синхронизации разных камер.

Для того, чтобы Watcher разрешил системе аналитики забирать видео, нужно получить API token.

Эпизоды

Вотчер использует модель данных episode вместо event для событий аналитики и это очень важно.

У эпизода есть следующие важные особенности:

  • идентификатор генерируется источником. Вы сами должны сгенерировать ID и использовать его, это не сложнее uuid
  • у эпизода есть плавающее начало и конец. Это более естественно для видео, чем точечное событие
  • вы можете сдвигать границы эпизода, если в процессе получилось доуточнить его

Жизненный цикл эпизода выглядит следующим образом:

  • Когда аналитика впервые находит что-то полезное на картинке в момент T1, создается эпизод с генерированным episode_id, media равным имени потока, opened_at=T1 и updated_at=T1. Поле opened_at проставляется один раз и потом никогда не меняется
  • Созданный эпизод сразу отправляется в вотчер вызовом episode_save. ID сгенерирован источником, поэтому отдельного метода episode_create нет
  • Если детекция объекта протяженная во времени, то в эпизоде обновляется updated_at, который обязательно должен увеличиваться с каждым изменением любого значения в эпизоде. В противном случае вотчер проигнорирует изменения
  • Если достоверно известно, что регистрация события в кадре закончилась (например, машина выехала), то можно проставить поле closed_at и больше его менять нельзя.
  • Поле preview эпизода нужно для передачи точного скриншота детекции, возможно порезанного до нужных размеров. Спокойно обновляйте его, если получилось сделать картинку получше. Это поле будет показываться в вотчере в списке детекций.
  • Весь эпизод каждый раз будет перетираться, так что присылайте все поля при обновлениях, это не частичный апдейт, а полное переписывание записи.

Snowflake ID

Мы используем 64-битный идентификатор вместо UUID, собранный по следующей структуре:

42 bits 10 bits 12 bits
millisecond timestamp machine-id sequence

Важно то, что этот идентификатор не влезает в 53 бита яваскрипта, поэтому при обратке его в яваскрипте нужно парсить его в строку. Например, можно использовать json-bignit вместо штатного механизма.

Этот подход нужен для того, чтобы идентификаторы можно было спокойно создавать на разных системах, не иметь единой точки отказа и чтобы они при этом были сортированные

Как проверить

Note

В API Watcher на данный момент не реализовано создание эпизодов, поэтому мы предлагаем временный вариант с созданием их через Central. Это планируется поменять в ближайшем будущем.

Для создания эпизодов в Central нужны:

  • Адрес сервера, где расположен Central
  • API KEY, который можно взять из /etc/central/central.conf

Если Central запущен за Flussonic, то запросы будут проксироваться, так что обращаться к порту 9019 (по умолчанию для Central) не требуется.

curl \
  -H 'Authorization: Bearer 08926CEA-3B54-4C77-99E2-A1F5FE54B11F' \
  -H 'Content-Type: application-json' \
  -d '{"episode_id":1722279170848854016,"media":"cam0","opened_at":1699458327000,"updated_at":1699458327000}'
  https://watcher-server/central/api/v3/episodes/1722279170848854016

Такого вызова будет достаточно для того, чтобы создать точечное событие, у которого конец и начало совпадают.

Для того, чтобы позже его обновить, можно повторно вызвать тот же запрос, но с обновленными полями:

curl \
  -H 'Authorization: Bearer 08926CEA-3B54-4C77-99E2-A1F5FE54B11F' \
  -H 'Content-Type: application-json' \
  -d '{"episode_id":1722279170848854016,"media":"cam0","opened_at":1699458327000,"updated_at":1699458338399,"preview":"..."}'
  https://watcher-server/central/api/v3/episodes/1722279170848854016

В preview уже надо подставить актуальное значение в виде base64(jpeg) картинки.

После этих действий можно увидеть новый эпизод в Watcher в списке.