Минимально-необходимый набор программ: видеосервер , публикатор , плеер , 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
Код: Выделить всё
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/
Код: Выделить всё
/путь/к/кинчику/кинчик.mp4
rtsp://логин999:пароль555@ип-адрес-камеры1
rtsp://логин999:пароль555@ип-адрес-камеры2
rtsp://логин999:пароль555@ип-адрес-камеры3
"c:\каталог\ещё какое-нибудь кино\видеоролик с тик-тока.mov"
Код: Выделить всё
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
###############################################
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 домен
Автоматическая загрузка видеосервера из под Win
Скачайте исполняемый файл WinSW v2 и поместите его в ту же папку, что и mediamtx.exe.
В той же папке создайте файл с именем WinSW-x64.xml с таким содержимым:
Код: Выделить всё
<service>
<id>mediamtx</id>
<name>mediamtx</name>
<description></description>
<executable>%BASE%/mediamtx.exe</executable>
</service>
Теперь сервер установлен как системная служба и будет запускаться при загрузке.
Более подробно о создании/удалении/управлении демонами автозагрузки можно почитать тут:
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
Как проверить программу перед запуском на вирусы в этой теме:
Онлайн проверка файлов на вирусы