Задача
Нужно было вывести видеонаблюдение на сайт. Камеры отдают RTSP, на вебе нужен HLS: стабильное воспроизведение и запас по числу зрителей.
Схема
Цепочка: Docker + FFmpeg (RTSP → RTMP) → MediaMTX (RTMP → HLS) → плеер на странице по M3U8.
Docker-контейнер с FFmpeg
Обработку потока вынес в контейнер: FFmpeg забирает RTSP с камер и пушит RTMP. На хост не ставится тяжёлый стек кодеков; конфиг и рестарт через Docker. Образ: alekseykrivoshein/mediamtx-rtsp.
MediaMTX
MediaMTX принимает RTMP от FFmpeg и отдаёт HLS. Браузеры и мобильные плееры с HLS работают стабильно; отдельный Flash или WebRTC «просто посмотреть камеру» не нужен.
Плеер на сайте
На фронте: Bradmax Player с HLS и M3U8. Подключается в разметку, работает на десктопе и на телефоне.
Реализация
Запуск контейнера
Образ с Docker Hub уже содержит нужное для RTSP → RTMP:
docker pull alekseykrivoshein/mediamtx-rtsp docker run -d --name=ffmpeg-rtsp-to-rtmp alekseykrivoshein/mediamtx-rtsp
Контейнер крутит конвертацию; дальше поток забирает MediaMTX.
Настройка MediaMTX
В конфиге MediaMTX важно:
- RTMP-вход: приём потока от FFmpeg
- HLS-выход: сегменты и M3U8 для браузера
После старта доступен плейлист, который уже можно отдать плееру.
HLS на странице
Минимальный вариант через video + HLS source (у Bradmax своя инициализация, смысл тот же: URL плейлиста):
<video id="videoPlayer" controls> <source src="https://yourserver.com/path/to/playlist.m3u8" type="application/x-mpegURL"> </video>
Пользователь открывает страницу и смотрит live без native-плеера и без установки ПО.
Результат
Схема RTSP → RTMP → HLS закрыла задачу:
- стабильный просмотр в браузере;
- управление потоками через контейнеры, без ручной установки FFmpeg на каждый хост;
- можно масштабировать: больше камер, больше контейнеров или инстансов MediaMTX.
Демо на объекте:
