Nginx RTMP module

 

 

Пример сборки Nginx'а с модулем RTPM на системе Ubuntu

 

Обновляем список пакетов и обновляем их:

apt update
apt upgrade -y

 

Устанавливаем необходимые пакеты для сборки:

apt install unzip build-essential libpcre3 libpcre3-dev openssl libssl-dev zlib1g zlib1g-dev libxslt-dev libgd-dev libgeoip-dev

 

Список аргументов можно подсмотреть где-то на ноде с установленным Nginx с пакетного менеджера.

nginx -V
nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.0g  2 Nov 2017
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

 

Если нет под рукой Nginx, то можно использовать аргументы для конфигурации ниже.

mkdir /tmp/hls
cd /tmp/hls

 

Скачиваем исходный код модуля:

wget https://codeload.github.com/arut/nginx-rtmp-module/zip/master
unzip master

 

Скачиваем Nginx (поменяйте на актуальную версию Nginx'а)

wget http://nginx.org/download/nginx-1.16.0.tar.gz
tar -xf tar -xf nginx-1.16.0.tar.gz

 

Переходим в разархивированную директорию с исходниками Nginx'а:

cd nginx-1.16.0

 

Добавляем в список аргументов "—add-module=/tmp/hls/nginx-rtmp-module-master" и выполняем "configure"

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-module=/tmp/hls/nginx-rtmp-module-master

 

Собираем:

make

 

Можно собирать используя мультипоточность, к примеру "make -j 4", где 4 — количество потоков

 

Если возникла подобная ошибка:

/tmp/hls/nginx-rtmp-module-master/ngx_rtmp_stat_module.c: In function ‘ngx_rtmp_stat_handler’:
/tmp/hls/nginx-rtmp-module-master/ngx_rtmp_stat_module.c:771:67: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
     NGX_RTMP_STAT_L("<built>" __DATE__ " " __TIME__ "</built>\r\n");
                                                                   ^
/tmp/hls/nginx-rtmp-module-master/ngx_rtmp_stat_module.c:771:67: error: macro "__TIME__" might prevent reproducible builds [-Werror=date-time]
cc1: all warnings being treated as errors
objs/Makefile:1743: recipe for target 'objs/addon/nginx-rtmp-module-master/ngx_rtmp_stat_module.o' failed
make[1]: *** [objs/addon/nginx-rtmp-module-master/ngx_rtmp_stat_module.o] Error 1
make[1]: Leaving directory '/tmp/hls/nginx-1.16.0'
Makefile:8: recipe for target 'build' failed
make: *** [build] Error 2

То необходимо переконфигурировать без этого ключа: "-Wdate-time" в секции "—with-cc-opt=" и заново запустить "make"

 

Если все собралось без ошибок, то устанавливаем:

make install

 

Добавляем сервис:

cat <<EOF >/lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target
EOF

 

Создаем пользователя:

adduser --system --no-create-home --user-group -s /sbin/nologin nginx

 

Или используем "nobody" в "nginx.conf"

 

Добавляем Nginx в автозапуск:

systemctl enable nginx

 

Запускаем и проверяем его статус:

systemctl start nginx
systemctl status nginx

 

Установливаем необходимые пакеты для стриминга:

apt install ffmpeg rtmpdump

 

Открываем файл конфигурации Nginx'а:

vim /etc/nginx/nginx.conf

 

И добавляем отдельно от существующего блока "http" следующее:

rtmp {
    server {
        listen 1935;
        application live {
            live on;
        }
    }
}

 

И перечитываем конфигурацию Nginx'а.

 

Попробуем стримить с мака на Nginx сервер:

brew install ffmpeg

 

Смотрим список устройств:

ffmpeg -f avfoundation -list_devices true -i ""

[AVFoundation input device @ 0x7fc2eacc9d00] AVFoundation video devices:
[AVFoundation input device @ 0x7fc2eacc9d00] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7fc2eacc9d00] [1] Capture screen 0
[AVFoundation input device @ 0x7fc2eacc9d00] AVFoundation audio devices:
[AVFoundation input device @ 0x7fc2eacc9d00] [0] Built-in Microphone

 

Проверяем запись:

ffmpeg -f avfoundation -framerate 30 -i "0" out.mpg

 

Терминал может запросить разрешение на доступ к вебкамере

 

Если все ок, то в текущей директории должен появиться видеофайл с именем "out.mpg"

 

Запускаем стрим на сервер:

ffmpeg -f avfoundation -r 30 -i "0:0" -deinterlace -vcodec libx264 -pix_fmt yuv420p -preset medium -g 60 -b:v 2500k -acodec libmp3lame -ar 44100 -threads 6 -qscale 3 -b:a 712000 -bufsize 512k -f flv rtmp://1.2.3.4/live/stream

 

При использовании ключа -i "0:0" будет так же передаваться звук с микрофона, только для одного видео потока используйте -i "0"

 

1.2.3.4IP адрес или DNS имя сервера Nginx

 

Открываем VLC и выбираем "File" -> "Open network" и указываем наш URL:

rtmp://1.2.3.4/live/stream

 

Не забываем разрешить на Nginx сервере TCP порт 1935.

0 0 vote
Рейтинг статьи

Метки: Метки

Подписаться
Уведомление о
guest
1 Комментарий
старее
новее большинство голосов
Inline Feedbacks
View all comments
Артём
Артём
1 год назад

Я поднимал похожим образом стриминговое реле на основе nginx-rtmp (чтобы можно было стримить на ютуб и твитч одновременно). При этом кодированием видео занималась Raspberry Pi (которая имеет встроенный аппаратный кодировщик видео) на которую я слал несжатый видеопоток. Работало, но пи не всегда справлялась). Тут задача чуть другая, но могу поделиться конфигами, если интересно.