Медиа-сервер (видеорегистратор) реального времени для IP-камер и/или потоковых трансляций

Ответить
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Медиа-сервер (видеорегистратор) реального времени для IP-камер и/или потоковых трансляций

Сообщение ya »

Чтобы посмотреть видео с видеосервера, его нужно опубликовать на видеосервер.
Минимально-необходимый набор программ: видеосервер , публикатор , плеер , ffmpeg .

В своём составе видеосервер использует 1 конфиг-файл для настройки, публикатор - 2 конфиг-файла (откуда берём видеоданные и куда отправляем видеопоток), плеер - 1 конфиг-файл (откуда воспроизводить видеопоток).

Особенности

Публикация прямых трансляций на сервер
Чтение прямых потоков с сервера
Потоки автоматически преобразуются из одного протокола в другой
Одновременная передача нескольких потоков по отдельным путям
Запись потоков на диск
Воспроизведение записанных потоков
Аутентификация пользователей; используйте внутреннюю или внешнюю аутентификацию
Перенаправлять читателей на другие RTSP-серверы (балансировка нагрузки)
Управление сервером через API управления
Перезагрузка конфигурации без отключения существующих клиентов (горячая перезагрузка)
Считывать метрики, совместимые с Prometheus
Выполнять хуки (внешние команды) при подключении, отключении, чтении или публикации потоков клиентами.
Совместим с Linux, Windows и macOS, не требует никаких зависимостей или интерпретаторов, это один исполняемый файл

Linux: https://github.com/bluenviron/mediamtx/releases/download/v1.5.1/mediamtx_v1.5.1_linux_amd64.tar.gz
Win: https://github.com/bluenviron/mediamtx/releases/download/v1.3.1/mediamtx_v1.3.1_windows_amd64.zip
mediamtx.zip
Конфиг видеосервера с оптимальными параметрами
(6.61 КБ) 1983 скачивания
mediamtx.zip
Конфиг видеосервера с оптимальными параметрами
(6.61 КБ) 1983 скачивания

Код: Выделить всё

2024/03/01 18:26:32 INF MediaMTX v1.5.1
2024/03/01 18:26:32 INF configuration loaded from /home/uralnix/mediamtx/mediamtx.yml
2024/03/01 18:26:32 INF [playback] listener opened on :9996
2024/03/01 18:26:32 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2024/03/01 18:26:32 INF [RTSPS] listener opened on :8322 (TCP)
2024/03/01 18:26:32 INF [RTMP] listener opened on :1935
2024/03/01 18:26:32 INF [RTMPS] listener opened on :1936
2024/03/01 18:26:32 INF [HLS] listener opened on :8888
2024/03/01 18:26:32 INF [WebRTC] listener opened on :8889 (HTTP), :8189 (ICE/UDP)
2024/03/01 18:26:32 INF [SRT] listener opened on :8890 (UDP)
2024/03/01 18:26:32 INF [API] listener opened on :9997

Состав файлов:

mediamtx.exe - Видеосервер (запустить)
mediamtx.yml - Конфиг для видеосервера
инструкция на английском

Публикация видео на сервер:

sendvideo.exe - Стартует публикацию видеопотоков на видеосервер ( данная версия устарела, см. sendvideo_v2.exe ниже )
serverip.txt - Конфиг: содержит (список) тип потока и адрес видеосервера (например, mediamtx), например:

Код: Выделить всё

 flv rtmp://логин:пароль@адрес_сервера_mediamtx/
 flv rtmp://логин1:пароль1@localhost/
 rtsp rtsp://логин2:пароль2@localhost/
 rtsp rtsp://логин3:пароль4@192.168.0.20/
 flv rtmp://212.119.243.135/
 flv rtmp://localhost/
 flv rtmp://localhost/
 flv rtmp://localhost/
 flv rtmp://localhost/ 
videostreams.txt - Конфиг: список публикуемых видеопотоков с ип-камер (или других видеоисточников), например

Код: Выделить всё

/путь/к/кинчику/кинчик.mp4
rtsp://логин999:пароль555@ип-адрес-камеры1
rtsp://логин999:пароль555@ип-адрес-камеры2
rtsp://логин999:пароль555@ип-адрес-камеры3
"c:\каталог\ещё какое-нибудь кино\видеоролик с тик-тока.mov"
videostreams_channels.txt - Конфиг: список публикуемых каналов, например:

Код: Выделить всё

channel
cam1
cam2
cam3
kinofromtiktok
инструкция на русском
ffmpeg - библиотека для функционирования sendvideo.exe
тут важно, чтобы количество строк в каждом из трёх конфиг-файлов было одинаково,
в данном примере: 5 публикуемых потока на 5 адресов.
Если имена каналов не указаны в явном виде, то sendvideo.exe сгенерирует их автоматически и запишет в файл videostreams_channels.txt
А так же, одинаковые имена каналов не должны публиковаться на один сервер, иначе будет опубликован последний поток с одноимённым каналом

Воспроизведение видео с сервера:
playvideo.exe - Стартует воспроизведение видеопотоков (всех одновременно) из списка в файле playlist.txt
playlist.txt - Конфиг: список видеопотоков

Код: Выделить всё

rtmp://логин:пароль@адрес_сервера_mediamtx/канал
rtmp://логин:пароль@адрес_сервера_mediamtx/канал
rtmp://адрес_сервера_mediamtx/канал7
инструкция на русском
ffmpeg - библиотека для функционирования playvideo.exe

Запись потоков на диск:
Для записи потоков на диск отредактировать конфигурационный файл mediamtx.yml, в секции Recording:

Код: Выделить всё

  ###############################################
  # Default path settings -> Recording

  # Record streams to disk.
  record: no
  # Path of recording segments.
  # Extension is added automatically.
  # Available variables are %path (path name), %Y %m %d %H %M %S %f (time in strftime format)
  recordPath: ./recordings/%path/%Y-%m-%d_%H-%M-%S-%f
  # Format of recorded segments.
  # Available formats are "fmp4" (fragmented MP4) and "mpegts" (MPEG-TS).
  recordFormat: fmp4
  # fMP4 segments are concatenation of small MP4 files (parts), each with this duration.
  # MPEG-TS segments are concatenation of 188-bytes packets, flushed to disk with this period.
  # When a system failure occurs, the last part gets lost.
  # Therefore, the part duration is equal to the RPO (recovery point objective).
  recordPartDuration: 100ms
  # Minimum duration of each segment.
  recordSegmentDuration: 1h
  # Delete segments after this timespan.
  # Set to 0s to disable automatic deletion.
  recordDeleteAfter: 24h

  ############################################### 
record: yes - Разрешает запись на диск (изменить на yes)
recordPath: ./recordings/%path/%Y-%m-%d_%H-%M-%S-%f - Путь для сохранения видеофайлов с меткой времени в имени файла (изменить путь на свой)
recordFormat: fmp4 - Использовать сегментированный формат потокового видео mp4/flv (не менять)
recordSegmentDuration: 1h - Минимальная продолжительность каждого сегмента (1 час)
recordDeleteAfter: 24h - По истечении 24 часов видео будут удалены
# После этого промежутка времени видео-сегменты будут удалены.
# Установите значение 0s, чтобы отключить автоматическое удаление.

Более подробно о записи на диск и управлению записанного видео тут:
Record streams to disk

Шифрование видеопотока (RTSPS/RTMPS):
Посредством ssl-сертификата
На примере Linux-сервера, сгенерировать ключи и сертификаты командой:

Код: Выделить всё

certbot --apache -d домен
И затем прописать пути до ключей и сертификатов в конфиг-файл mediamtx.yml видеосервера и перезапустить видеосервер, а так же снова выполнить программу для публикации видеопотоков sendvideo

Автоматическая загрузка видеосервера из под Win
Скачайте исполняемый файл WinSW v2 и поместите его в ту же папку, что и mediamtx.exe.
В той же папке создайте файл с именем WinSW-x64.xml с таким содержимым:

Код: Выделить всё

<service>
  <id>mediamtx</id>
  <name>mediamtx</name>
  <description></description>
  <executable>%BASE%/mediamtx.exe</executable>
</service>
В окне командной строки выполнить: WinSW-x64 install
Теперь сервер установлен как системная служба и будет запускаться при загрузке.

Более подробно о создании/удалении/управлении демонами автозагрузки можно почитать тут:
Windows Service Wrapper

Хуксы:
Сервер позволяет указать команды, которые выполняются при наступлении определенного события, что позволяет распространять события на внешнее программное обеспечение.

runOnConnect позволяет запускать команду, когда клиент подключается к серверу
runOnDisconnect позволяет выполнить команду, когда клиент отсоединяется от сервера
runOnInit позволяет запускать команду при инициализации пути. Это можно использовать для публикации потока при запуске сервера
runOnDemand позволяет запускать команду, когда путь запрашивается читателем. Это можно использовать для публикации потока по требованию
runOnUnDemand позволяет выполнять команду, когда читателей больше нет
runOnReady позволяет выполнить команду, когда поток готов к чтению
runOnNotReady позволяет выполнить команду, когда поток больше не доступен
runOnRead позволяет выполнить команду, когда клиент начинает читать
runOnUnread позволяет выполнить команду, когда клиент прекращает чтение
runOnRecordSegmentCreate позволяет выполнить команду при создании сегмента записи
runOnRecordSegmentComplete позволяет выполнить команду, когда сегмент записи завершен

Управление и отслеживание событий на сервере через API-интерфес
Управление и состояние сервера (API) можно интегрировать в веб-кам сайт или мобильное приложение посредством API-интерфейса
Сервер может запрашивать данные и управляться с помощью API. Для включения, установив параметр api в конфигурации:
api: yes
API прослушивает apiAddress, который по умолчанию равен 127.0.0.1:9997; например, чтобы получить список активных путей

Код: Выделить всё

curl http://127.0.0.1:9997/v2/paths/list
Полная документация по Control API доступна на специальном сайте.

Как проверить программу перед запуском на вирусы в этой теме:
Онлайн проверка файлов на вирусы
Последний раз редактировалось ya 02 мар 2024, 06:56, всего редактировалось 12 раз.
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Вторая версия программы для публикации видеопотока на сервер

Сообщение ya »

Вторая версия программы для публикации видеопотока на сервер
теперь зависит от двух конфигурационных файлов, а не как ранее от трёх

в этой версии объединены: адрес публикуемого потока и канал публикации в одном конфиг-файле

sendvideo_v2.exe - Стартует публикацию видеопотоков на видеосервер (запустить)
sendvideo_v2_output.txt - Конфиг: содержит (список) тип потока, адрес видеосервера (например, mediamtx) и канал, например:

Код: Выделить всё

flv rtmp://логин:пароль@адрес_сервера/канал1
flv rtmp://логин:пароль@адрес_сервера/канал2
flv rtmp://логин:пароль@адрес_сервера/канал3
sendvideo_v2_input.txt - тоже самое, что и ранее бывший videostreams.txt
ffmpeg - библиотека для функционирования sendvideo_v2

При первом запуске создаст два пустых файла конфигурации:
sendvideo_v2_input.txt - адреса входящих видеопотоков
sendvideo_v2_output.txt - адреса исходящих видеопотоков
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: Медиа-сервер реального времени

Сообщение ya »

Публикатор видеопотока третья версия:
sendvideo_v3.exe

Данная версия поддерживает отправку видео на сервер только по rtsp протоколу с перекодировкой аудио в aac

Конфиги публикации (sendvideo_v3.exe):

входящего потока (с камеры) sendvideo_input.txt

Код: Выделить всё

rtsp://логин:пароль@10.0.1.112:554/1/1
исходящего потока (на сервер) sendvideo_output.txt

Код: Выделить всё

rtsp://172.16.5.1:8554/home1
rtsp://172.16.5.1:8554/home2
rtsp://172.16.5.1:8554/home3
rtsp://172.16.5.1:8554/home4
rtsp://172.16.5.1:8554/home5
Внимание!!! не перепутать
Публикуемый поток на сервер по rtsp протоколу на 8554 порт
Поток для воспроизведения с видеосервера по rtsps протоколу на 8322 порт

Конфиг воспроизведения (просмотр потока с сервера playvideo.exe ) playlist.txt

Код: Выделить всё

rtsps://172.16.5.1:8322/home1
rtsps://172.16.5.1:8322/dapa
rtsps://172.16.5.1:8322/sleep
rtsps://172.16.5.1:8322/davno
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: Медиа-сервер реального времени

Сообщение ya »

Публикатор видеопотока четвёртая версия:
sendvideo_v4.exe

Данная версия, так же как третья, поддерживает отправку видео на сервер только по rtsp протоколу с перекодировкой аудио в aac

И добавлено перекодирование видеопотока библиотекой libx265
При этом нагрузка на 10 ядерный центральный процессор составила 20% при публикации потока и нагрузка на сеть снизилась в 2 раза по сравнению с отправкой в формате h.264.

Внимание!!!
Если исходное видео в формате h.265, то лучше для публикации потока использовать третью версию

Конфиги публикации (sendvideo_v4.exe): такие же как в третьей версии
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Re: Медиа-сервер реального времени

Сообщение ya »

приложение для ип-камер: StreamShow

https://play.google.com/store/apps/details?id=com.devinterestdev.streamshow

Для просмотра видеоархива приложение: X-plore
Ответить