Онлайн трансляции с помощью модуля Ngnix-rtmp-module
Для организации онлайн трансляций в реальном режиме времени, видео по запросу (vod), а также для осуществления записи видео-потоков можно использовать nginx вместе с модулем nginx-rtmp-module.
Медиа серверы
На сегодняшний день существуют несколько популярных медиа серверов, о которых вы можете подробнее почитать в одной из моих прошлых статей. Медиа серверы необходимы для создания онлайн трансляций в реальном режиме времени.
Существуют как платные, так и бесплатные медиа серверы, включающие в себя разные функции. Сегодня мы поговорим об одном бесплатном и довольно неплохом решении.
Ngnix-rtmp
Базовый функционал медиа сервера, также можно реализовать с помощью бесплатного программного обеспечения — модуля Ngnix-rtmp-module, который на данный момент поддерживает такие потоковые протоколы как RTMP и HLS.
Таким образом, с помощью Ngnix-rtmp (веб сервер Ngnix + модуль Ngnix-rtmp-module), можно организовать вещание по RTMP и HLS на устройства пользователей. Сводную таблицу протоколов и устройств, которые их поддерживают, можно посмотреть в статье Медиа серверы (Wowza, Erlyvideo, FMS) и компоненты систем видео трансляций. Также в одной из будущих своих статей я планирую сделать сравнительную таблицу функционала модуля Ngnix-rtmp-module и других медиа серверов.
Онлайн трансляция по протоколу HLS
Сегодня мы рассмотрим, как с помощью модуля Nginx-rtmp-module организовать простейшую трансляцию с адаптивным битрейтом по протоколу HLS. В первую очередь нам необходимо скачать исходные коды веб-сервера Nginx с официального сайта. Все команды, представленные ниже исполнялись в Linux.
- wgethttp://nginx.org/download/nginx-1.4.1.tar.gz
Извлечь файлы из архива.
Скачать zip архив с исходными файлами модуля nginx-rtmp-module и извлечь файлы из архива.
- wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
Теперь нам необходимо скомпилировать nginx с модулем nginx-rtmp-module, для этого при конфигурации nginx нужно указать в опции —add-module расположение исходных файлов nginx-rtmp-module, а также необходимо указать дополнительную опцию with-http_ssl_module.
./configure —add-module=/home/nginx/nginx-rtmp-module-master —with-http_ssl_module
- Если все прошло без ошибок, можно приступать к настройке сервера. По умолчанию сервер устанавливается в директорию /usr/local/nginx . Конфигурационный файл сервера nginx.conf, находится в директории /usr/local/nginx/conf . Рассмотрим подробнее секцию rtmp:server конфигурационного файла. Параметр listen указывает порт на котором сервер будет принимать rtmp запросы.
- Далее мы открываем секцию для настройки приложения testlive. Здесь мы указываем, что у нас live-поток — параметр live on, включаем поддержку протокола hls для этого приложения – параметр hls on.
- С помощью параметра hls_path мы задаем директорию в которой буду располагаться чанки (кусочки) потока. Для того чтобы чанки (кусочки) для каждого видео потока располагались в отдельной директории необходимо подключить директиву hls_nested on.
- Далее с помощью параметра allow publish мы разрешаем публиковать потоки с своего компьютера, а с помощью параметра deny publish all запрещаем всем остальным публиковать видео.
- Теперь рассмотрим секцию http:server . В параметре listen необходимо указать на коком порту сервер будет принимать http запросы. Мы указываем порт 8080. И из примера конфигурационного файла перенести секцию http:server:location /hls . Посмотреть более подробную информацию по всем директивам конфигурационного файла можно по адресу: https://github.com/arut/nginx-rtmp-module/wiki/Directives.
- Настало время запустить сервер. Для этого необходимо перейти в директорию/usr/local/nginx/bin и выполнить команду ./nginx.
Теперь рассмотрим один пример. Мы отправляем на сервер три видео-потока:
- test1 с битрейтом 256 кбит/с,
- test2 с битрейтом 512 кбит/с,
- test3 с битрейтом 1024 кбит/с.
Наша задача, чтобы клиент, использующий протокол HLS (устройства: Mac, iPad, iPhone) мог динамически переключаться между потоками, в зависимости от качества Интернет соединения. Для этого нам необходимо в директории /usr/local/nginx/html создать файл с расширением m3u8, например playlist.m3u8, со следующим содержимым:
Просмотр трансляции
Для просмотра видео-потоков необходимо в веб-страницу сайта встроить следующий код.
[ip-адрес(nginx сервера)] — ip-адрес вашего nginx сервера.
Nginx rtmp hls windows
Краткая инструкция по созданию рестрима при помощи Nginx.
1) Скачиваем
Сам Nginx уже с модулем rtmp
WEB морда для отслеживание потоков
2) Необходимо все разархивировать
nginx-rtmp-win32-master.zip в папку C:\Nginx\nginx-rtmp-win32-master
nginx-rtmp-module-master.zip в папку C:\Nginx\nginx-rtmp-win32-master\www2
3) Настраиваем Nginx
для этого необходимо отредактировать C:\Nginx\nginx-rtmp-win32-master\conf\nginx.conf
error_log logs/error.log debug;
events <
worker_connections 1024;
>
rtmp <
server <
listen 1935;
application live <
live on;
>
application hls <
live on;
hls on;
hls_path temp/hls;
hls_fragment 8s;
>
>
>
http <
server <
listen 8080;
location / <
root www;
>
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
root www;
>
location /hls <
#server hls fragments
types <
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
>
alias temp/hls;
expires -1;
>
в секции rtmp:
rtmp <
server <
listen 1935;
ping 30s;
notify_method get;
application myapp <
live on;
push rtmp://localhost/GG;
push rtmp://localhost/YOUTUBE;
push rtmp://localhost/YOUTUBEBACKUP;
push rtmp://localhost/TWITCH;
push rtmp://localhost/CYBERGAME;
application GG <
live on;
record off;
push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
>
application YOUTUBE <
live on;
record off;
push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
>
application YOUTUBEBACKUP <
live on;
record off;
push rtmp://b.rtmp.youtube.com/live2?backup=1/ключ трансляции;
>
application TWITCH <
live on;
record off;
push rtmp://live-fra.twitch.tv/app/Ключ трансляции;
>
application CYBERGAME <
live on;
record off;
push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
>
с начало создаем сервис на который мы будем стриметь и который будет рестриметь на другие источники «application myapp <", где myapp его название, которое будем в бивать в настройки OBS или XSplit.
Далее описываем куда будем рестриметь что бы было все красиво
«push rtmp://localhost/’имя сервиса’ «
Теперь создаем сами потоки рестрима для примера GG
application GG <
live on;
record off;
push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
>
где самое главное это push rtmp://rtmp сервер/ключ трансляции;
Должно быть все понятно, тут нечего сложного.
в секции http:
http <
server <
listen 8080;
location / <
root www;
>
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
root www;
>
location /hls <
#server hls fragments
types <
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
>
alias temp/hls;
expires -1;
>
тут кому как удобно, можно добавить новые настройки или заменить старые, я оставил старые на всякий случай и добавил дополнительную секцию
server <
listen 8081;
server_name localhost;
root www2;
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
# you can move stat.xsl to a different location
root www2;
>
# rtmp control
location /control <
rtmp_control all;
>
error_page 500 502 503 504 /50x.html;
location = /50x.html <
root html;
>
>
где самое главное поменять порт, я поставил «listen 8081;»
пусть к корневому каталогу «root www2;» где указывается папка создаваемая в самом начале «nginx-rtmp-module-master.zip в папку C:\Nginx\nginx-rtmp-win32-master\www2»
остальное можно не трогать.
4) Проверяем настройки
запускаем командную строку, для этого необходимо нажать на «Пуск» и в поле поиска вбить «cmd», или «Пуск/Все программы/Стандартные/Командная строка» после чего появляется окно.
Далее переходим в каталог с Nginx, для этого набираем «cd Путь», в моем случае cd C:\Nginx\nginx-rtmp-win32-master
Далее пишем nginx -t и должны увидеть следующее
nginx: the configuration file C:\nginx/conf/nginx.conf syntax is ok
nginx: configuration file C:\nginx/conf/nginx.conf test is successful
Если выводит нечто другое — вчитываемся в ошибку, пытаемся исправить (обычно это не поставленная точка с запятой или забытая скобка).
Если все верно то запускаем nginx: набираем nginx, жмем Enter. Командная строка зависнет — это нормально, значит все нормально запустилось и что бы точно убедится открываем браузер и запускаем http://localhost:8081/stat , должны увидеть табличку
Теперь можно остановить nginx, для этого запускаем опять командную строку, так же переходим в папку с Nginx, «cd C:\Nginx\nginx-rtmp-win32-master» и что бы сотановить сервер нам надо набрать nginx -s stop. Или просто некорректно вырубить из диспетчера задач процесс.
5) Настраиваем стрим-программу.
Для примера покажу настройки OBS.
Тут все совсем просто: нужно указать в качестве сервера наш компьютер.
Для этого лезем в настройки и в настройках Трансляции выбираем Сервер вещания «Custom» и в FMS URL: rtmp://localhost/myapp
где «myapp» это название которое мы указывали в настройках nginx в секции rtmp.
Все теперь готово, запускаем сервер Nginx и запускаем трансляцию, о состоянии рестримов можно отслеживать через WEB морду http://localhost:8081/stat
есть еще WEB морда изначальная http://localhost:8080/ , но я в ней не разбирался и мне она не нужна была.
6) Для удобства запуска и остановки сервера
Для этого создадим 3 bat файлика
nginx-start.bat — для старта
@ECHO OFF
set root=C:\Nginx\nginx-rtmp-win32-master
cd /D %root%
start nginx.exe
nginx-reload.bat — для применения изменения конфигов
@ECHO OFF
set root=C:\Nginx\nginx-rtmp-win32-master
cd /D %root%
nginx.exe -s reload
nginx-stop.bat — для остановки
@ECHO OFF
set root=C:\Nginx\nginx-rtmp-win32-master
cd /D %root%
nginx.exe -s stop
При этом, nginx-start.bat можно положить в автозагрузку.
где «set root=C:\Nginx\nginx-rtmp-win32-master» пусть до Nginx сервера, куда мы все разархивировали.
7) Безопасность
Теперь когда все работает, надо подумать о безопасности, что бы не кто не мог стриметь кроме вас на ваш сервер.
Для этого создадим белые IP адреса, с которых можно стриметь
для этого в секции в настройках Nginx (C:\Nginx\nginx-rtmp-win32-master\conf\nginx.conf) в секции rtmp нам нужно кое что дописать.
В каждом application нудно добавить следующие настройки:
allow publish 127.0.0.1; # локальный адрес
allow publish 192.168.1.13; # ip адрес ПК с которого будет идти стрим
allow publish 83.153.39.122; # адрес с которого будет идти стрим в не дома
deny publish all; # Запретить все остальные
вот так выглядят полностью мои настройки C:\Nginx\nginx-rtmp-win32-master\conf\nginx.conf
error_log logs/error.log debug;
events <
worker_connections 1024;
>
rtmp <
server <
listen 1935;
ping 30s;
notify_method get;
application myapp <
live on;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://localhost/GG;
push rtmp://localhost/YOUTUBE;
push rtmp://localhost/YOUTUBEBACKUP;
push rtmp://localhost/TWITCH;
push rtmp://localhost/CYBERGAME;
application GG <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
>
application YOUTUBE <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
>
application YOUTUBEBACKUP <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://b.rtmp.youtube.com/live2?backup=1/ключ трансляции;
>
application TWITCH <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://live-fra.twitch.tv/app/Ключ трансляции;
>
application CYBERGAME <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
>
http <
server <
listen 8080;
location / <
root www;
>
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
root www;
>
location /hls <
#server hls fragments
types <
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
>
alias temp/hls;
expires -1;
>
>
server <
listen 8081;
server_name localhost;
root www2;
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
# you can move stat.xsl to a different location
root www2;
>
# rtmp control
location /control <
rtmp_control all;
>
error_page 500 502 503 504 /50x.html;
location = /50x.html <
root html;
>
>
В общем на это все.
Это моя первая статья, извините если есть какие то недочеты, надеюсь эта статья вам поможет.
Краткая инструкция по созданию рестрима при помощи Nginx.
1) Скачиваем
Сам Nginx уже с модулем rtmp
WEB морда для отслеживание потоков
2) Необходимо все разархивировать
nginx-rtmp-win32-master.zip в папку C:\Nginx\nginx-rtmp-win32-master
nginx-rtmp-module-master.zip в папку C:\Nginx\nginx-rtmp-win32-master\www2
3) Настраиваем Nginx
для этого необходимо отредактировать C:\Nginx\nginx-rtmp-win32-master\conf\nginx.conf
error_log logs/error.log debug;
events <
worker_connections 1024;
>
rtmp <
server <
listen 1935;
application live <
live on;
>
application hls <
live on;
hls on;
hls_path temp/hls;
hls_fragment 8s;
>
>
>
http <
server <
listen 8080;
location / <
root www;
>
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
root www;
>
location /hls <
#server hls fragments
types <
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
>
alias temp/hls;
expires -1;
>
в секции rtmp:
rtmp <
server <
listen 1935;
ping 30s;
notify_method get;
application myapp <
live on;
push rtmp://localhost/GG;
push rtmp://localhost/YOUTUBE;
push rtmp://localhost/YOUTUBEBACKUP;
push rtmp://localhost/TWITCH;
push rtmp://localhost/CYBERGAME;
application GG <
live on;
record off;
push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
>
application YOUTUBE <
live on;
record off;
push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
>
application YOUTUBEBACKUP <
live on;
record off;
push rtmp://b.rtmp.youtube.com/live2?backup=1/ключ трансляции;
>
application TWITCH <
live on;
record off;
push rtmp://live-fra.twitch.tv/app/Ключ трансляции;
>
application CYBERGAME <
live on;
record off;
push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
>
с начало создаем сервис на который мы будем стриметь и который будет рестриметь на другие источники «application myapp <", где myapp его название, которое будем в бивать в настройки OBS или XSplit.
Далее описываем куда будем рестриметь что бы было все красиво
«push rtmp://localhost/’имя сервиса’ «
Теперь создаем сами потоки рестрима для примера GG
application GG <
live on;
record off;
push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
>
где самое главное это push rtmp://rtmp сервер/ключ трансляции;
Должно быть все понятно, тут нечего сложного.
в секции http:
http <
server <
listen 8080;
location / <
root www;
>
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
root www;
>
location /hls <
#server hls fragments
types <
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
>
alias temp/hls;
expires -1;
>
тут кому как удобно, можно добавить новые настройки или заменить старые, я оставил старые на всякий случай и добавил дополнительную секцию
server <
listen 8081;
server_name localhost;
root www2;
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
# you can move stat.xsl to a different location
root www2;
>
# rtmp control
location /control <
rtmp_control all;
>
error_page 500 502 503 504 /50x.html;
location = /50x.html <
root html;
>
>
где самое главное поменять порт, я поставил «listen 8081;»
пусть к корневому каталогу «root www2;» где указывается папка создаваемая в самом начале «nginx-rtmp-module-master.zip в папку C:\Nginx\nginx-rtmp-win32-master\www2»
остальное можно не трогать.
4) Проверяем настройки
запускаем командную строку, для этого необходимо нажать на «Пуск» и в поле поиска вбить «cmd», или «Пуск/Все программы/Стандартные/Командная строка» после чего появляется окно.
Далее переходим в каталог с Nginx, для этого набираем «cd Путь», в моем случае cd C:\Nginx\nginx-rtmp-win32-master
Далее пишем nginx -t и должны увидеть следующее
nginx: the configuration file C:\nginx/conf/nginx.conf syntax is ok
nginx: configuration file C:\nginx/conf/nginx.conf test is successful
Если выводит нечто другое — вчитываемся в ошибку, пытаемся исправить (обычно это не поставленная точка с запятой или забытая скобка).
Если все верно то запускаем nginx: набираем nginx, жмем Enter. Командная строка зависнет — это нормально, значит все нормально запустилось и что бы точно убедится открываем браузер и запускаем http://localhost:8081/stat , должны увидеть табличку
Теперь можно остановить nginx, для этого запускаем опять командную строку, так же переходим в папку с Nginx, «cd C:\Nginx\nginx-rtmp-win32-master» и что бы сотановить сервер нам надо набрать nginx -s stop. Или просто некорректно вырубить из диспетчера задач процесс.
5) Настраиваем стрим-программу.
Для примера покажу настройки OBS.
Тут все совсем просто: нужно указать в качестве сервера наш компьютер.
Для этого лезем в настройки и в настройках Трансляции выбираем Сервер вещания «Custom» и в FMS URL: rtmp://localhost/myapp
где «myapp» это название которое мы указывали в настройках nginx в секции rtmp.
Все теперь готово, запускаем сервер Nginx и запускаем трансляцию, о состоянии рестримов можно отслеживать через WEB морду http://localhost:8081/stat
есть еще WEB морда изначальная http://localhost:8080/ , но я в ней не разбирался и мне она не нужна была.
6) Для удобства запуска и остановки сервера
Для этого создадим 3 bat файлика
nginx-start.bat — для старта
@ECHO OFF
set root=C:\Nginx\nginx-rtmp-win32-master
cd /D %root%
start nginx.exe
nginx-reload.bat — для применения изменения конфигов
@ECHO OFF
set root=C:\Nginx\nginx-rtmp-win32-master
cd /D %root%
nginx.exe -s reload
nginx-stop.bat — для остановки
@ECHO OFF
set root=C:\Nginx\nginx-rtmp-win32-master
cd /D %root%
nginx.exe -s stop
При этом, nginx-start.bat можно положить в автозагрузку.
где «set root=C:\Nginx\nginx-rtmp-win32-master» пусть до Nginx сервера, куда мы все разархивировали.
7) Безопасность
Теперь когда все работает, надо подумать о безопасности, что бы не кто не мог стриметь кроме вас на ваш сервер.
Для этого создадим белые IP адреса, с которых можно стриметь
для этого в секции в настройках Nginx (C:\Nginx\nginx-rtmp-win32-master\conf\nginx.conf) в секции rtmp нам нужно кое что дописать.
В каждом application нудно добавить следующие настройки:
allow publish 127.0.0.1; # локальный адрес
allow publish 192.168.1.13; # ip адрес ПК с которого будет идти стрим
allow publish 83.153.39.122; # адрес с которого будет идти стрим в не дома
deny publish all; # Запретить все остальные
вот так выглядят полностью мои настройки C:\Nginx\nginx-rtmp-win32-master\conf\nginx.conf
error_log logs/error.log debug;
events <
worker_connections 1024;
>
rtmp <
server <
listen 1935;
ping 30s;
notify_method get;
application myapp <
live on;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://localhost/GG;
push rtmp://localhost/YOUTUBE;
push rtmp://localhost/YOUTUBEBACKUP;
push rtmp://localhost/TWITCH;
push rtmp://localhost/CYBERGAME;
application GG <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
>
application YOUTUBE <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
>
application YOUTUBEBACKUP <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://b.rtmp.youtube.com/live2?backup=1/ключ трансляции;
>
application TWITCH <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://live-fra.twitch.tv/app/Ключ трансляции;
>
application CYBERGAME <
live on;
record off;
allow publish 127.0.0.1;
allow publish 192.168.1.13;
allow publish 83.153.39.122;
deny publish all;
push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
>
http <
server <
listen 8080;
location / <
root www;
>
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
root www;
>
location /hls <
#server hls fragments
types <
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
>
alias temp/hls;
expires -1;
>
>
server <
listen 8081;
server_name localhost;
root www2;
location /stat <
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
>
location /stat.xsl <
# you can move stat.xsl to a different location
root www2;
>
# rtmp control
location /control <
rtmp_control all;
>
error_page 500 502 503 504 /50x.html;
location = /50x.html <
root html;
>
>
В общем на это все.
Это моя первая статья, извините если есть какие то недочеты, надеюсь эта статья вам поможет.