Задача у нас следующая: Необходимо организовать трансляцию с камер или регистраторов на сайт «Безопасный город». Все регистраторы подключены к интернету через разных провайдеров и не имеют белых 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
[bash title=»код»]yum install nano[/bash]
Настравиваем репозиторий nginx
[bash title=»код»]nano /etc/yum.repos.d/nginx.repo[/bash]
[bash title=»код»][nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1[/bash]
[bash title=»код»]yum install nginx pcre-devel openssl-devel[/bash]
Мы устанавливаем nginx из репозитория, для создания стартовых скриптов.
Теперь смотрим версию nginx которая установилась
[bash title=»код»]nginx -v[/bash]
и ищем ссылку на архив https://nginx.org/download нашей версии
[bash title=»код»]cd /tmp/
wget https://nginx.org/download/nginx-1.14.2.tar.gz[/bash]
Скачиваем nginx-rtmp-module
[bash title=»код»]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[/bash]
Чтобы не было ошибок при компиляции устанавливаем необходимый пакет
[bash title=»код»]yum install gcc[/bash]
Конфигурируем и собираем
[bash title=»код»]./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[/bash]
Запускаем
[bash title=»код»]service nginx start[/bash]
Теперь необходимо поставить пакеты ffmpeg и rtmpdump
[bash title=»код»]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[/bash]
Если у вас есть белый ip, то вы пропускаете описание настройки создания l2tp подключения между Mikrotik и сервером Centos 6.
[bash title=»код»]nano /etc/nginx/conf.d/default.conf[/bash]
[bash title=»код»]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;
}
}[/bash]
[bash title=»код»]nano /etc/nginx/nginx.conf[/bash]
[bash title=»код»]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;
}
}[/bash]
Вам необходимо просто пробросить rtsp порт на роутере (по умолчанию 554) и указать в конфиге nginx все свои камеры.
После чего они станут доступны по адресам rtmp://ip_сервера/cam1/stream или http://ip_сервера/cam1/stream.m3u8
Более подробное описание и примеры я брал тут
Если у вас нет белого постоянного или динамического ip на роутере, идём дальше.
Необходимо создать l2tp подключения роутера Mikrotik или другого, на ваш выбор, куда подключен регистратор с сервером Centos 6, который будет выполнять функцию ретранслятора нашего видео.
Ставим l2tp сервер и другие необходимые пакеты
[bash title=»код»]yum install -y ppp xl2tpd bind-utils[/bash]
Конфигурируем
[bash title=»код»]nano /etc/ppp/options.xl2tpd[/bash]
[bash title=»код»]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[/bash]
[bash title=»код»]nano /etc/xl2tpd/xl2tpd.conf[/bash]
[bash title=»код»][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[/bash]
[bash title=»код»]nano /etc/ppp/chap-secrets[/bash]
[bash title=»код»]# Secrets for authentication using CHAP
# client server secret IP addresses
reg1 vpn-server пароль 10.0.0.10
reg2 vpn-server пароль 10.0.0.11[/bash]
В этом файле мы назначаем локальные ip нашим регистраторам или камера при подключении с разных мест. Чтобы при ребуте сервера не переназначались локальные Ip
Запускаем l2tp сервер
[bash title=»код»]service xl2tpd start[/bash]
Не забываем про автозапуск.
[bash title=»код»]chkconfig xl2tpd on
chkconfig nginx on[/bash]
В зависимости от конфигурации вашего виртуального или физического сервера, у вас может быть включен фаервол. Вам открыть порты 1701 и 554
либо остановить его для тестирования
[bash title=»код»]service iptables stop[/bash]
На этом, сервер готов забирать и отдавать ваши потоки
Переходим к настройке Mikrotik. Нужно пробросить локальный порт в наш l2tp туннель
Как это сделать, я подробно описал в этой статье