Задача у нас следующая: Необходимо организовать трансляцию с камер или регистраторов на сайт «Безопасный город». Все регистраторы подключены к интернету через разных провайдеров и не имеют белых ip адресов. Нужно предоставить доступ к видео с камер большому количеству людей, а регистратор не выдержит такой нагрузки. Поэтому будем организовывать ретрансляцию потока на виртуальный или физический сервер.
В качестве регистратора используется модель Dahua DH-XVR5108C-S2
Уличные купольные камеры Dahua DH-HAC-HDW1200MP-S3
Для ретрансляции используем виртуальный сервер на ОС Centos 6
Для подключения регистратора к серверу и проброски необходимого локального порта будем использовать роутер Mikrotk. На самом деле подойдёт любая модель и базовые знания для создания правил. Мы используем Mikrotik hAP Lite
Регистратор отдаёт потоки с подключенных камер в формате:
rtsp://логин:пароль@ip:порт/cam/realmonitor?channel=1&subtype=0 — камера 1
rtsp://логин:пароль@ip:порт/cam/realmonitor?channel=2&subtype=0 — камера 2
С настройками регистратора каждый разберётся сам.
Готовим сервер Centos 6 для ретрансляции. Нам необходимо установить пакеты
Ставим текстовый редактор nano
yum install nano
Настравиваем репозиторий nginx
nano /etc/yum.repos.d/nginx.repo
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
yum install nginx pcre-devel openssl-devel
Мы устанавливаем nginx из репозитория, для создания стартовых скриптов.
Теперь смотрим версию nginx которая установилась
nginx -v
и ищем ссылку на архив https://nginx.org/download нашей версии
cd /tmp/ wget https://nginx.org/download/nginx-1.14.2.tar.gz
Скачиваем nginx-rtmp-module
wget https://github.com/arut/nginx-rtmp-module/archive/master.tar.gz tar xzf nginx-1.14.2.tar.gz tar xzf master.tar.gz cd nginx-1.14.2
Чтобы не было ошибок при компиляции устанавливаем необходимый пакет
yum install gcc
Конфигурируем и собираем
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=../nginx-rtmp-module-master make make install
Запускаем
service nginx start
Теперь необходимо поставить пакеты ffmpeg и rtmpdump
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm sudo yum install ffmpeg sudo yum install rtmpdump
Если у вас есть белый ip, то вы пропускаете описание настройки создания l2tp подключения между Mikrotik и сервером Centos 6.
nano /etc/nginx/conf.d/default.conf
server { listen 80; server_name localhost; location / { root /tmp; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /tmp; } }
nano /etc/nginx/nginx.conf
user nginx; worker_processes auto; rtmp_auto_push on; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } rtmp { live on; hls on; hls_fragment 5s; server { listen 1935; application cam1 { hls_path /tmp/cam1; } application cam2 { hls_path /tmp/cam2; } exec_static ffmpeg -i rtsp://admin:pass@ip:554/cam/realmonitor?channel=1&subtype=0 -c copy -f flv rtmp://127.0.0.1/cam1/stream; exec_static ffmpeg -i rtsp://admin:pass@ip:554/cam/realmonitor?channel=2&subtype=0 -c copy -f flv rtmp://127.0.0.1/cam2/stream; } }
Вам необходимо просто пробросить rtsp порт на роутере (по умолчанию 554) и указать в конфиге nginx все свои камеры.
После чего они станут доступны по адресам rtmp://ip_сервера/cam1/stream или http://ip_сервера/cam1/stream.m3u8
Более подробное описание и примеры я брал тут
Если у вас нет белого постоянного или динамического ip на роутере, идём дальше.
Необходимо создать l2tp подключения роутера Mikrotik или другого, на ваш выбор, куда подключен регистратор с сервером Centos 6, который будет выполнять функцию ретранслятора нашего видео.
Ставим l2tp сервер и другие необходимые пакеты
yum install -y ppp xl2tpd bind-utils
Конфигурируем
nano /etc/ppp/options.xl2tpd
ms-dns 8.8.8.8 ms-dns 8.8.4.4 noccp auth crtscts idle 1800 mtu 1280 mru 1280 lock lcp-echo-failure 10 lcp-echo-interval 60 connect-delay 5000 logfile /var/log/ppp/ppp.log
nano /etc/xl2tpd/xl2tpd.conf
[global] port = 1701 [lns default] ip range = 10.0.0.200-10.0.0.255 local ip = 10.0.0.1 refuse chap = yes refuse pap = yes require authentication = yes name=vpn-server ppp debug = no pppoptfile = /etc/ppp/options.xl2tpd length bit = yes
nano /etc/ppp/chap-secrets
# Secrets for authentication using CHAP # client server secret IP addresses reg1 vpn-server пароль 10.0.0.10 reg2 vpn-server пароль 10.0.0.11
В этом файле мы назначаем локальные ip нашим регистраторам или камера при подключении с разных мест. Чтобы при ребуте сервера не переназначались локальные Ip
Запускаем l2tp сервер
service xl2tpd start
Не забываем про автозапуск.
chkconfig xl2tpd on chkconfig nginx on
В зависимости от конфигурации вашего виртуального или физического сервера, у вас может быть включен фаервол. Вам открыть порты 1701 и 554
либо остановить его для тестирования
service iptables stop
На этом, сервер готов забирать и отдавать ваши потоки
Переходим к настройке Mikrotik. Нужно пробросить локальный порт в наш l2tp туннель
Как это сделать, я подробно описал в этой статье