Inspark Media Server
Функциональность
MediaServer реализует функции захвата видео-потока с камер по протоколу RTSP и управление видеокамерами, поддерживающие протокол PZT ONVIF.
MediaServer раздает видео-поток по протоколу HLS и предоставляет REST API для команд PZT ONVIF протокола.
MediaServer использует FFmpeg библиотеку для работы с видео-потоком и поддерживает все настройки командной строки FFmpeg.
Комментарий
FFmpeg — open-source кроссплатформенная библиотека и набор программ командной строки для обработки, конвертации, записи и потоковой передачи аудио и видеофайлов. Это один из самых мощных и популярных инструментов
в мире мультимедиа, который работает в большом количестве как платных, так и бесплатных видео приложений и сервисов.
Для обращения к функциям FFmpeg MediaServer использует JavaCV.
PTZ ONVIF каждым производителем видеокамер может поддерживаться в ограниченном виде.
Не все поддерживают методы получения ограничений, абсолютных координаты, значения PTZ в абсолютных и относительных значениях, установки камеры по координатам и др., но все камеры поддерживающие PTZ ONVIF минимально поддерживают методы Continuous Move (непрерывное движение).
C использованием этих методов media-gate выполняет управление:
- Pan (панонимирование) повороты по горизонтали или X, реализуется командами:
- повернуть направо;
- повернуть налево;
- остановить движение.
- Tilt (наклон) повороты по вертикали или Y, реализуется командами:
- наклон вниз;
- наклон вверх;
- остановить движение.
- Zoom (масштабирование), реализуется командами:
- увеличить;
- уменьшить;
- остановить.
Установка модуля
Предварительные условия
- Для установки модуля на хосте требуется наличие JRE (от 21.x и выше) и совместимая ОС.
- В зависимости от количества камер, подключаемых к MediaServer, ресурсы потребляемые модулем (память, процессор, диск) для конвертации, записи и представление видео могут быть
значительными. Рекомендуется MediaServer устанавливать на выделенном сервере.
Модуль не использует перекодирование видео с камер, но при большом количестве камер (более 50) и высоком качестве видео, необходим мониторинг ресурсов сервера. Если загрузка сервера по CPU более 50% рекомендуется подключать камеры по вторичному потоку.
Типовые требования к RAM:
- до 16 камер: 8–16 ГБ.
- 16–32 камер: 16–32 ГБ.
- 32–64 камер: 32–64 ГБ.
- если нет SSD дисков, но достаточно памяти, примонтируйте часть оперативной памяти как диск и использовать ее для записи HLS-фрагментов:
mkdir /mnt/ramdisk
mount -t tmpfs -o size=500M tmpfs /mnt/ramdiskУстановка в качестве демона
- Создать директорию
/opt/media-gateи поместить в нееmedia-gate.jar, application.yml.
mkdir /opt/media-gate
cp media-gate.jar /opt/media-gate
cp application.yml /opt/media-gate
cp media-gate.conf /opt/media-gate- Создать файл сервиса
/etc/systemd/system/media-gate.serviceследующего содержания:
[Unit]
Description=media-gate
After=syslog.target
[Service]
User=root
Group=root
ExecStart=/opt/media-gate/media-gate.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target- Перечитать список сервисов linux
systemctl daemon-reload- Запуск и остановку сервиса можно осуществлять стандартными командами, т.е.
service media-gate start
service media-gate status
service media-gate stop- Запуск с командной строки:
java -jar media-gate.jar
Настройка модуля
В конфигурационном файле application.yml настройте разделы как показано ниже
# порт http сервера (метрики http://localhost:port/metrics)
server:
port: 8005
servlet:
context-path: /media-gate
spring:
application:
name: media-gate
# профили логирования, console - вывод в консоль, file - вывод в файл
profiles:
active: file
# уровни логирования модулей
logging:
level:
root: INFO
ru.inspark.sem.gate.media: INFO
# подключение к рест-сервисам inspark (должен заканчиваться слэшем), extSystemId должен совпадать с именем Провайдера в (см. документацию по Провайдерам)
rest:
url: http://localhost:8080/sem-restservices/
user: user
password: password
extSystemId: MediaServer
# параметры подключения к артемис inspark
artemis:
url: tcp://localhost:61616
user: user
password: password
# количество потоков в пуле для отправки JMS-сообщений
senderThreads: 8
# настройки очередей (см. имена свойств и дефолты в lib-gate)
queue:
event:
destination: jms.queue.Event
# Настройка стандартных топиков каналов ИП камеры media-gate в Inspark
# (если канал не задан, значение не будет отправляться в Inspark)
channels:
url: url # url для отображения видео по HLS
online: online # признак подключения и записи видео с камеры
err: err # последняя ошибка с камеры
err-count: err_count # количество ошибок с камеры
record: record # сигнальный параметр о начале/окончании записи архивного видео камеры
record-file: record-file # URL последней архивной записи камеры
ptz-online: ptz-online
# Настройки модуля
media:
# базовый url для доступа к media-gate, если не задан, тогда по умолчанию http://localhost:8005/media-gate/
# если задан, тогда url/<context-path>
base-url: http://10.1.1.1/media-gate/
# Директория для хранения видео файлов по камерам
output-path: /mnt/ramdisk/data/
# Время устаревания кэша доступа пользователей к устройству в Inspark (как часто проверять доступ в Inspark,
# при запросах пользователя к видеопотоку камеры) в минутах, по умолчанию 60 минут
access-timeout: 60
# Директория для хранения записей видео с камер, указывать диск компьютера. Должна завершаться слэшем.
record-path: ./record/
# Базовый URL для получения записи с камеры (используется при отправке событий и измерений записи). Должен завершаться слэшем.
record-base-url: http://10.1.1.1/media-gate/record/
# Событие начала записи (event.id), если не задано регистрироваться не будет
record-start-event-id: 31234
# Событие завершения записи (event.id), если не задано регистрироваться не будет
record-stop-event-id: 31234
# Описания камер: ключ секции - имя камеры, оно же extDeviceId устройства в Inspark.
cams:
cam1:
# URL подключения к видеопотоку камеры по протоколу RTSP. Если задан - шлюз будет опрашивать поток камеры и
# конвертировать в HLS. Может быть не задан если от камеры нет прямого RTSP потока.
rtsp-url: rtsp://user:password@10.10.10.1:554/Streaming/Channels/102
# URL подключения к камере для управления по протоколу PTZ. Может быть не задан если камера не поддерживает
# управление по протоколу ONVIF.
ptz-url:
cam2:
rtsp-url: rtsp://user:password@10.10.10.1:554/Streaming/Channels/102
emul1:
rtsp-url: rtsp://10.1.1.111:8554/cam1
emul2:
rtsp-url: rtsp://10.1.1.112:8554/cam2Модель устройств в платформе
RTSP камера
Название устройства: RTSP_Camera
Классификатор устройств: VIDEOCAMERA
Топик устройства: rtsp
Комментарий: Предоставление видео по протоколу HLS (HTTP Live Streaming), без поддержки PTZ
Список каналов устройства:
| Атрибут | Топик | Тип параметра | Коммент |
|---|---|---|---|
| url | url | URL VIDEO | содержит ссылку на поток с камеры в формате hls на media-gate |
| online | online | сигнал | показывает текущее состояние камеры. |
| record | record | сигнал | игнальный параметр о начале/окончании записи архивного видео камеры |
| record-file | record-file | URL VIDEO | URL последней архивной записи камеры |
| ptz-online | ptz-online | сигнал | признак достпности управления по ONVIF протоколу |
| err_count | err_count | счетчик импульсов | количество ошибок обработки и записи видео с камеры |
| err | err | строковый | последнее сообщение об ошибке с камеры |
url - значение данного параметра используется для воспроизведения видео с камеры. Данный параметр устанавливается media-gate при инициализации камеры.
Канал имеет интервал восстановления 0, если камера не доступна при инициализации модуль присылает значение null.
online - имеет интервал восстановления отличный от 0, по заданному интервалу восстановления media-gate присылает состояние камеры.
Значения параметров err_count и err, используются для принятия решения управления параметрами записи видео с камеры.
Для каждой внешней системы в интеграцию которой включаются видеокамеры с поддержкой PTZ должны быть созданы следующие
внешние команды:
| Название | Команда | Данные | Описание |
|---|---|---|---|
| вверх | tilt_up | Начать движение камеры вверх. | |
| вниз | tilt_down | Начать движение камеры вниз. | |
| налево | pan_left | Начать движение камеры влево. | |
| направо | pan_right | Начать движение камеры вправо. | |
| стоп наклон/поворот | pan_tilt_stop | Остановить движение. | |
| увеличить | zoom_in | Начать увеличение на камере. | |
| уменьшить | zoom_out | Начать уменьшение камеры. | |
| стоп масштабирование | zoom_stop | Остановить движение. |
.
Настройка в платформе
- Создать типовую конфигурацию, где в схеме подключения будут подключены Устройства RTSP_Camera PZT_Camera с типом подключения GATE.
- Привязать ТК к Объекту через контроллер.
- Создать Провайдера (например ID = MediaGate, см. настройку application.yml, ключ ExtSystemID).
- В разделе Устройства внешней системы зарегистрировать ID устройств, для RTSP_Camera и PZT_Camera.
- для RTSP_Camera идентификатором внешнего устройства является rtsp url видеокамеры, если камера поддерживает авторизацию в идентификаторе задается логин и пароль пользователя (например,
rtsp://admin:admin@10.10.1.1:554/0); - для PZT_Camera идентификатором внешнего устройства является http url, если камера поддерживает авторизацию ONVIF в идентификаторе задается логин и пароль пользователя (по правилам базовой аутентификации, например
http://admin:admin@10.10.2.2:8899);
- Связать каждое внешнее устройство с экземпляром устройства платформы.
- Запустить media-gate
Описание работы модуля
- media-gate при старте читает список интегрируемых устройств (камер). Идентификатором внешнего устройства является
описание секции media.cams.идентиифкатор, например для описания ниже идентификатор будет "cam1"
media:
...
cams:
...
cam1:
# URL подключения к видеопотоку камеры по протоколу RTPS. Если задан - шлюз будет опрашивать поток камеры и
# конвертировать в HLS. Может быть не задан если от камеры нет прямого RTSP потока.
rtsp-url: rtsp://user:password@10.4.2.227:554/Streaming/Channels/102
# URL подключения к камере для управления по протоколу PTZ. Может быть не задан если камера не поддерживает
# управление по протоколу ONVIF.
ptz-url:- для каждой камеры проверяется наличие необходимых параметров в устройстве (см. п. выше);
- для каждой камеры проверяется возможность подключения к ней и получения видео, если камера не доступна или
восстанавливается после запуска, чтобы видео с нее обрабатывалось модулем, необходимо его перезапустить, также
необходимо перезапустить модуль после подключения новой камеры в интеграцию (это связано с постоянным выделением для
каждой камеры ресурсов системы); - по каждой интегрируемой камере, прошедшей поверку и имеющей заданный rtps-url, запускается отдельная нить которая выполняет следующие действия:
- в директории данных media-gate, создается директория для размещения видео с камеры, имя директории - идентификатор
устройства в платформе Inspark; - создается захватчик (grabber) и писатель (recorder) видео, с параметрами установленными в конфигурационном файле
media-gate; - видео с камеры не конвертируется и записывается в том же формате (H.264) в файлы представляющие фрагменты
видео установленного размера (см. описание hls протокола); - видео с камер записывается в файлы вне зависимости есть или нет в платформе клиенты, которым представляется видео
пользователям, при успешной обработке видео, модуль в соответствии с настройками периодически отправляет значение
параметра камеры online со значением true; - если во время захвата и записи видео с камеры в ее работе фиксируются критические ошибки и сохранение видео
не возможно, тогда модуль отправляет значение параметра камеры online со значением false и описанием ошибки, а также
увеличивается параметр счетчика ошибок; - после критических ошибок с доступом к камере или конвертации, модуль осуществляет попытки переподключиться к камере
и восстановить запись видео; - ошибки конвертации или качества видео, которые не влияют на запись фрагментов, в платформу не отправляются их можно
посмотреть только в логе модуля;
- видео с интегрированных камер предоставляется специальным rest контроллером, обеспечивающим раздачу видео контента
по протоколу HLS (HTTP Live Streaming):
- адрес контроллера http:/<модуль>:<порт>/hls/{camId}/
- <модуль> - контекст модуля (media-gate);
- <порт> - порт модуля (8005);
- camId - идентификатор внешнего устройства (камеры) в Inspark (extDeviceId);
- filename - запрашиваемая часть видеопотока, или плэйлист - stream.m3u8, или TS (Transport Stream) сегмент
streamNNN.ts
- Чтобы получить доступ к видео, пользователь должен быть авторизован в Inspark и у него должен быть доступ к
устройству (камере). Модуль права доступа пользователя к камере запрашивает у Inspark и кеширует (время жизни кэша
один час), т.е. если пользователю предоставили/забрали права, они могут применяться на контроллере с задержкой.