Python · 31.07.2026

Фрагменты кода: RTSPmv

Уже был пост про сабж, но там всё было очень сухо и однообразно.

Вместо предисловия…

Так уж повелось с проектами на python — первым делом они отправляются прямиком в репозиторий, а потом (может быть, если найдётся минутка) попадают сюда. Зачастую, я просто не успеваю за ними и получается, что они живут своей яркой жизнью где-то за пределами кода в качестве фрагментов. Отсюда и название рубрики — фрагменты кода. Отдельную метку для рубрики я заводить не стал: змеиных проектов у меня не так много и материала хватит на пару-тройку постов (где-то так, да).

Этим вечером я расскажу про проект, который уже давно пылится на моей страничке в GitFlic, но до сайта так и не добрался. Работаю, конечно, на ретроспективу, но зато с опережением графика.

Сабж!

Смоделируем ситуацию. На неком объекте было установлено несколько разных IP-камер с поддержкой rtsp-потоков. Задача: необходимо обеспечить просмотр потоков в реальном времени. Запись не нужна, этим занимается программный видеорегистратор. Нужны только потоки на одной веб-страничке.

После пары выходных я предложил решение в виде python-скрипта на основе Flask. Это я про многострадальный RTSPmv, который развился из этой зарисовки. Теперь о том, что же это такое и какое вино нужно к нему подавать.

А сейчас станет душно…

RTSPmv — очень маленький веб-сервер на Python для просмотра rtsp-потоков на веб-странице в реальном времени. Расшифровывается, как RTSP mini viewer. По совместительству, он же герой этого поста.

Весь проект со стороны backend’а построен на Python. Если не планируете пускать на страничку проекта кучу народа, то можно ограничиться только средой Flask и обойтись без unicorn. Медийная составляющая реализована с помощью библиотек opencv-python и numpy. К визуальному оформлению добавлена небольшая щепотка JS. Кстати, у RTSPmv есть какой-никакой API, откуда script.js и получает все необходимые данные.

Теперь функционал

Стоит сразу упомянуть, что все адреса потоков и сопутствующая информация хранятся в файле streams.json в открытом виде. Поэтому настоятельно рекомендую озаботится, чтобы в файле не фигурировали учетные записи администраторов камер, а то может случится неприятное. Создайте на камерах отдельных юзеров с возможностью «только просмотра», а еще лучше форкните проект и прикрутите шифрование. Спасибо, пожалуйста, всех благ!

Кадр из сериала Friends

Вот пример содержимого файла streams.json:

{
    "video_feeds": [
        {
            "video_feed_num": "01",
            "url": "rtsp://login:password@192.168.1.101/stream1",
            "name": "Stream #1"
        },
        {
            "video_feed_num": "02",
            "url": "rtsp://login:password@192.168.1.102/stream1",
            "name": "Stream #2"
        },
        {
            "video_feed_num": "03",
            "url": "rtsp://login:password@192.168.1.103/stream1",
            "name": "Stream #3"
        }
    ]
}

Каждый поток в файле streams.json описан тремя «переменными»: video_feed_num, url, name.

Переменная video_feed_num хранит номер потока, в url содержится адрес rtsp-потока, а в name вписывается имя потока. Это имя отображается в «шапке» контейнера с видео.

rtspmv
Страница сервера версии 20250610

В процессе тестирования первых версий веб-сервера я столкнулся с проблемой зависания при воспроизведении большого количества потоков. Позже я ввёл ограничение на количество активных потоков вещания. За количество обрабатываемых потоков отвечает переменная MAX_STREAMS.

Таким образом, RTSPmv прочитает файл streams.json и обработает только первые потоки в количестве, заданном в переменной MAX_STREAMS. Адреса остальных потоков будут игнорироваться.

Системные переменные в скрипте:

MAX_BUFFER_SIZE = 5
APP_PORT = 5000
MAX_STREAMS = 6

Установка и запуск приложения с помощью git:

cd ~
git clone https://gitflic.ru/project/ngdream/rtspmv.git
cd rtspmv
pip install -r requirements.txt
python app.py

Или можно создать виртуальное окружение:

cd ~
git clone https://gitflic.ru/project/ngdream/rtspmv.git
cd rtspmv
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python app.py

В общем — держите ссылки: