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 устанавливать на выделенном сервере. - Требуемые аппаратные ресурсы зависят от количества камер подключаемых к модулю. Используйте SSD диск не менее 100Мб для уменьшения времени задержки видео-потока. Используйте хост с видеокартой в режиме графического ускорения. Для задач MediaServer достаточно RAM 8-16 Gb, при включении 4K потока 32-64 Gb.
Установка в качестве демона
- Создать директорию
/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 настройте разделы как показано ниже
Инфо
Так как основой захвата и сохранения видео является продукт FFmpeg, то в конфигурационном файле для их настройки может быть использован любой параметр представленный в документации https://ffmpeg.org/ffmpeg.html#Options в соответсвующем разделе application.yml ffmpeg.grabber или ffmpeg.recorder в формате "ключ": значение.
Используемые параметры могут зависеть от используемых кодеков, например, описанный ниже GOP size. Если параметр(ы) для FFmpeg модулем не применяется (например, видео создается не заданного качества), необходимо его применение проверить с использованием запуска FFmpeg из командной строки с передачей всех задаваемых параметров из настройки конфига media-gate.
# подключение к рест-сервисам inspark (должен заканчиваться слэшем)
rest:
url: http://localhost:8080/sem-restservices/
user: user
password: pass
# Идентификатор внешней системы
extSystemId: MediaGate
# параметры подключения к артемис inspark
artemis:
url: tcp://localhost:61616
user: artemis
password: artemis
# количество потоков в пуле для отправки JMS-сообщений
senderThreads: 8
# настройки очередей (см. имена свойств и дефолты в lib-gate)
queue:
event:
destination: jms.queue.Event
# Очередь для команд PTZ
extcommand:
destination: jms.topic.ExtCommand
# Настройка стандартных топиков каналов ИП камер media-gate в Inspark
# (если канал не задан, значение не будет отправляться в Inspark)
channels:
#Настройка стандартных топиков для rtsp протокола
rtsp:
url: url # url для отображения видео по HLS
online: online # признак подключения и записи видео с камеры
err: err # последняя ошибка с камеры при захвате или записи видео
errCount: err_count # количество ошибок с камеры
#Настройка стандартных топиков для onvif ptz протокола
ptz:
online: online # признак подключения и доступности функций PTZ
err: err # последняя ошибка с камеры при управлении plain, tilt, zoom
errCount: err_count # количество ошибок с камеры
# Настройки модуля
media:
# базовый url для доступа к контроллеру, если не задан, тогда по умолчанию http://localhost:8005/media-gate/
# если задан, тогда url/<context-path>
base-url: http://localhost/media-gate/
# Директория для хранения видео файлов по камерам
output-path: ./data/
# Время устаревания кэша доступа пользователей к устройству в Inspark (как часто проверять доступ в Inspark,
# при запросах пользователя к видеопотоку камеры) в минутах, по умолчанию 60 минут
access-timeout: 5
# Настройки по умолчанию захвата и сохранения видео с камер с использованием FFmpeg. Применение в названии параметра
# суффикса ":v" ":a" управляет к видео или к аудио применяется параметр, если не задавать параметр будет применяться
# глобально
ffmpeg:
# настройки захвата видео с камер
grabber:
# формат камеры "rtsp", "mp4", "video4linux2", не путать с протоколом rtsp
format:
# Частота кадров, по умолчанию определяется камерой
framerate:
# Ширина видео, по умолчанию определяется камерой
width:
# Высота видео, по умолчанию определяется камерой
height:
# Количество аудио каналов (1,2,4), по умолчанию определяется камерой
ac:
# Битрейт видео, по умолчанию определяется камерой
b:v:
# Идентификатор видео кодека, по умолчанию H264, возможные кодеки и их идентификаторы см. в ffmpeg
vcodec:
# Битрейт аудео, по умолчанию определяется камерой
b:a:
# Идентификатор видео кодека, по умолчанию AAC, возможные кодеки и их идентификаторы см. в ffmpeg
acodec:
# Дополнительные опции, полный список опций см. ffmpeg, ниже представлен наиболее часто
# применяемый в примерах
rtsp_transport: tcp # транспорт к камере tcp, если камера не в локальной сети
timeout: 5000000 # общий таймаут в микросекундах
stimeout: 5000000 # таймаут сокета в микросекундах
# HTTP options
user_agent:
rw_timeout: #Read/write timeout
# Buffer options
fflags: # nobuffer - reduce latency
flags: #low_delay - enable low delay mode
#Hardware Acceleration
hwaccel: # auto - Auto-select hwaccel (по умолчанию), cuda - NVIDIA CUDA и т.п. dxva2, videotoolbox
# настройки транскодирования и записи видео в формате HLS
recorder:
# формат записи (пока только hls)
format: hls
# Ширина видео, по умолчанию определяется захватом
width:
# Высота видео, по умолчанию определяется захватом
height:
# Количество аудио каналов (1,2,4), по умолчанию определяется камерой
ac: 2
# битрейт видео, по умолчанию определяется камерой
"b:v": 0
# Идентификатор видео кодека, по умолчанию H264, возможные кодеки и их идентификаторы см. в ffmpeg
vcodec: libx264
# битрейт аудео, по умолчанию определяется камерой
"b:a": 128k
# идентификатор видео кодека, по умолчанию AAC, возможные кодеки и их идентификаторы см. в ffmpeg
acodec: aac
# GOP size (keyframe interval in frames). Название параметра зависит от кодека для H264|H265 "keyint:v": 60,
# для большинства "g" или "g:v": 60, для MPEG-2 "gop_size:v", чтобы не путаться в конфиге пишем "g" в коде
# используется специальный метод
"g": 60
# Дополнительные опции, полный список опций см. ffmpeg, ниже представлен наиболее часто
# применяемый в примерах
# Настройка HLS
# длина в секундах одной части видео
hls_time: 4
# количество частей
hls_list_size: 6
# что делать с устаревшей частью
hls_flags: delete_segments
# шаблон имени для части
hls_segment_filename: stream_%03d.ts
stimeout: # 5 second timeout (in μs)
# H.264/H.265 options
"preset:v": veryfast # ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
"tune:v": zerolatency # Optimize for low latency
"crf:v": 23 # Constant Rate Factor (0-51, lower=better)
"gp:v": 0 # Отключить quantization parameter
x264-params: #keyint=60:min-keyint=60:scenecut=0");
# Дополнительные параметры для стабильности
"profile:v": high
"level:v": 4.1
"movflags:v": faststart
"flags:v": +cgop
Модель устройств в платформе
RTSP камера
Название устройства: RTSP_Camera
Классификатор устройств: VIDEOCAMERA
Топик устройства: rtsp
Комментарий: Предоставление видео по протоколу HLS (HTTP Live Streaming), без поддержки PTZ
Список каналов устройства:
Атрибут | Топик | Тип параметра | Коммент |
---|---|---|---|
url | url | URL VIDEO | содержит ссылку на поток с камеры в формате hls на media-gate |
online | online | сигнал | показывает текущее состояние камеры. |
err_count | err_count | счетчик импульсов | количество ошибок обработки и записи видео с камеры |
err | err | строковый | последнее сообщение об ошибке с камеры |
url - значение данного параметра используется для воспроизведения видео с камеры. Данный параметр устанавливается media-gate при инициализации камеры.
Канал имеет интервал восстановления 0, если камера не доступна при инициализации модуль присылает значение null.
online - имеет интервал восстановления отличный от 0, по заданному интервалу восстановления media-gate присылает состояние камеры.
Значения параметров err_count и err, используются для принятия решения управления параметрами записи видео с камеры.

PZT камера
Название устройства: PTZ_Camera
Классификатор устройств: VIDEOCAMERA
Топик канала: ptz
Комментарий: Видеокамеры с поддержкой PTZ
Список каналов устройства:
Атрибут | Топик | Тип параметра | Коммент |
---|---|---|---|
online | online | сигнал | показывает поддержку камерой PTZ. |
err_count | err_count | счетчик импульсов | количество ошибок подключения к камере |
err | err | строковый | последнее сообщение об ошибке с камеры |
online - имеет интервал восстановления 0, при старте media-gate опрашивает камеру по протоколу ONVIF и если камера поддерживает протокол PTZ, присылает значение true.
Если камера не доступна или не поддерживает протокол, состояние камеры будет в false.
Значения параметров err_count и err, используются для отображения результатов подключения к камере для управления PTZ.

Для каждой внешней системы в интеграцию которой включаются видеокамеры с поддержкой PTZ должны быть созданы следующие
внешние команды:
Название | Команда | Данные | Описание |
---|---|---|---|
вверх | tilt_up | Начать движение камеры вверх. | |
вниз | tilt_down | Начать движение камеры вниз. | |
налево | pan_left | Начать движение камеры влево. | |
направо | pan_right | Начать движение камеры вправо. | |
стоп наклон/поворот | pan_tilt_stop | Остановить движение. | |
увеличить | zoom_in | Начать увеличение на камере. | |
уменьшить | zoom_out | Начать уменьшение камеры. | |
стоп масштабирование | zoom_stop | Остановить движение. |
.
Настройка в платформе
- Создать ТК, где в схеме подключения будут подключены Устройства RTSP_Camera PZT_Camera с типом подключения GATE.
Инфо
Если с камеры нужно получить видео-поток, и управлять ею по PZT, создаются два устройства: одно RTSP_Camera, и второе PZT_Camera.
- Привязать ТК к Объекту через контроллер.
- Создать Провайдера (например 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 при старте читает список интегрируемых устройств (камер). Идентификатором внешнего устройства является
rtsp url видеокамеры (например, rtsp://admin:admin@10.10.1.1:554/0); - Для каждой камеры проверяется наличие необходимых параметров в устройстве (см. п. выше);
- Для каждой камеры проверяется возможность подключения к ней и получения видео. Если камера не доступна или восстанавливается после запуска, чтобы видео с нее обрабатывалось модулем, необходимо его перезапустить.
Также необходимо перезапустить модуль после подключения новой камеры в интеграцию (это связано с постоянным выделением для каждой камеры ресурсов системы); - По каждой интегрируемой камере, прошедшей поверку, запускается отдельный процесс, который выполняет следующие действия:
- в папке данных media-gate, создается директория для размещения видео с камеры, имя директории = идентификатор устройства в платформе Inspark;
- создается захватчик (grabber) и писатель (recorder) видео, с параметрами установленными в конфигурационном файле media-gate;
- видео с камеры конвертируется и записывается в файлы представляющие фрагменты видео установленного размера;
- видео с камер записывается в файлы вне зависимости есть, или нет в платформе клиенты, которым представляется видео пользователям, при успешной обработке видео, модуль в соответствии с настройками периодически отправляет значение параметра камеры online со значением true;
- если во время захвата и записи видео с камеры в ее работе фиксируются критические ошибки и сохранение видео не возможно, тогда модуль отправляет значение параметра камеры online со значением false и описанием ошибки, а также увеличивается параметр счетчика ошибок;
- после критических ошибок с доступом к камере или конвертации, модуль осуществляет попытки переподключиться к камере и восстановить запись видео;
- ошибки конвертации или качества видео, которые не влияют на запись фрагментов, в платформу не отправляются их можно посмотреть только в логе модуля;
- Видео с интегрированных камер предоставляется специальным rest контроллером, обеспечивающим раздачу видео контента по протоколу HLS (HTTP Live Streaming):
- адрес контроллера http:/<модуль>:<порт>/hls/{unitId}/{filename:.+}
- <модуль> - контекст модуля (media-gate);
- <порт> - порт модуля (8005);
- unitId - идентификатор устройства (камеры) в Inspark;
- filename - запрашиваемая часть видеопотока, или плэйлист - stream.m3u8, или TS (Transport Stream) сегмент streamNNN.ts
- Чтобы получить доступ к видео, пользователь должен быть авторизован в Inspark и у него должен быть доступ к устройству (камере).
Модуль периодически запрашивает у Inspark права пользователя к камере, т.е. если пользователю предоставили/забрали права, они могут применяться на контроллере с задержкой.
Алгоритм работы модуля при управлении камерой
- Media-gate при старте читает список интегрируемых устройств (камер). Идентификатором внешнего устройства является http url интерфейса ONVIF видеокамеры (важно задавать не конечную точку PTZ ONVIF, а общую конечную точку всех
интерфейсов ONVIF), если камера поддерживает авторизацию ONVIF в идентификаторе задается логин и пароль пользователя (по правилам базовой аутентификации, например http://admin:admin@10.10.2.2:8899); - Для каждой камеры проверяется наличие необходимых параметров в устройстве (см. п. выше);
- Для каждой камеры проверяется поддержка PTZ и версия PTZ ONVIF 1.0 или 2.0. Если камера не доступна или восстанавливается после запуска модуля, чтобы ей можно было управлять, необходимо модуль перезапустить, также необходимо перезапустить модуль после подключения новой камеры в интеграцию (данное ограничение идет от RTSP);
- далее модуль слушает очередь внешних команд, по приходу внешней команды выполняются следующие действия:
- по устройству определяется адрес камеры на которой вызываются методы ONVIF PTZ и создается токен аутентификации в
соответствии с параметрами пользователь пароль в идентификаторе внешнего устройства; - команды поворота вправо/влево, создается 2D вектор движения камеры, у которого соответсвенно команде X=1.0/-1.0 Y=0, устанавливается максимальное время движения камеры 5 секунд, выполняется метод непрерывного движения, который запустит движение камеры, до получения команды стоп, истечение 5 секунд на движение, достижения максимального угла поворота камеры 1.0/-1.0;
- команды наклона вверх/вниз, создается 2D вектор движения камеры, у которого соответсвенно команде X=0, Y=1.0/-1.0, устанавливается максимальное время движения камеры 5 секунд, выполняется метод непрерывного движения, который запустит движение камеры, до получения команды стоп, истечение 5 секунд на движение, достижения максимального угла наклона камеры 1.0/-1.0;
- команды масштаба увеличить/уменьшить, создается 1D вектор движения камеры, у которого соответсвенно команде X=1.0/0, устанавливается максимальное время движения камеры 5 секунд, выполняется метод непрерывного движения, который запустит масштабирование камеры, до получения команды стоп, истечение 5 секунд на движение,достижения максимального увеличения/уменьшения 1.0/0;
- команда стоп наклон/поворот, вызывается специальный метод с параметрами остановки движения;
- команда стоп масштабирование, вызывается специальный метод с параметрами остановки zoom;
- если метод(ы) ONVIF PTZ принятой команды выполнился камерой без ошибок в Inspark платформу отправляется событие 3014 (Команда успешно отправлена внешнему устройству);
- если метод(ы) ONVIF PTZ принятой команды выполнились камерой с ошибками в Inspark платформу отправляется событие 3012 (Ошибка формата команды для контроллера или внешнего устройства) с детализацией ошибки;
- если интерфейс ONVIF PTZ камеры на момент выполнения команды был не доступен, в Inspark платформу отправляется событие 3011 (Команда не передана контроллеру или внешнему устройству).
Инфо
Камеры поддерживающие ONVIF PTZ могут не иметь технических возможностей осуществлять масштабирования видео, но при этом принимать команды управления масштабом без ошибок.