Что ж, бесплатные сервисы для рестриминга, о которых я писал ранее, отлично справляются со своей функцией. Но в контексте трансляций 24/7 с большим количеством платформ (например, радио, как в моем случае), все-таки это не лучший вариант: рандомные обрывы связи с сервером, роняющие транслирующий скрипт (в среднем, один раз в две недели); малое количество единовременных подключений или отсутствие поддержки нужной площадки, из-за чего приходится городить “многоножку” из сервисов, либо переходить на платные тарифы (которые еще нужно суметь оплатить).
Будучи человеком только влившимся в относительные дебри веб-технологий, я не сразу подумал о логичном шаге: поискать решения запуска собственного рестрим-сервера на VPS. А когда подумал, то решил, что простейшая конфигурация моей машины (1 CPU, 1 GB RAM) не потянет такие функции, особенно, в паре с транслирующим скриптом.
В общем, мои предрассудки значительно оттянули момент, когда я все-таки пришел к Nginx-серверу и его RTMP-модулю, которые оказались отличным решением для моего радио-потока 24/7:
- Стабильная работа и отсутствие обрывов связи (ну кроме тех случаев, когда проблема на стороне хостера VPS).
- Легкая и быстрая настройка без заморочек.
- Минимальная нагрузка на процессор (буквально 1% в моем случае).
- Возможность добавить любые площадки вставкой rtmp-адреса с ключом и в количестве, которое позволит ваш интернет-канал (например, ваша скорость 100мб/сек, битрейт стрима 3мб/сек (3000кб/с) -> вы можете ретранслировать на +/- 30 каналов).
- Из минусов можно отметить отсутствие возможности отключать/перезапускать отдельные каналы без рестарта условного OBS (но не исключаю, что я просто не нашел способа).
На самом деле, по Nginx-RTMP достаточно много гайдов и различной информации, т.к. это весьма популярный способ ретрансляции среди стримеров (да, Nginx можно настроить и на Windows – об этом я подскажу в конце поста). Например, я, когда впервые настраивал себе сервер пользовался этими источниками:
- https://www.digitalocean.com/community/tutorials/how-to-set-up-a-video-streaming-server-using-nginx-rtmp-on-ubuntu-20-04
- https://goodgame.ru/topic/74992/
А потому я не видел смысла в том, чтобы пересказывать изученное и не брался за этот пост. Но, поразмыслив какое-то время, передумал: все же это существенная часть моего опыта в создании 24/7 стрима, которым я решил делиться с самого начала, стараясь доступно давать информацию тем, кто как и я впервые имеет дело с VPS, Linux и прочим..
В гайде, который пойдет дальше я расскажу об установке и настройке Nginx на систему Ubuntu 20.04 и кратко о Windows.
NGINX
Первым делом нужно установить сам Nginx-сервер:
sudo apt update sudo apt install nginx
После установки в директорию: /etc/nginx он автоматически запустится. Это можно проверить командой:
systemctl status nginx
В логе отобразится информация, где среди прочего будет строка “Active”:
Active: active (running) since ...
Еще команды для управления Nginx, которые пригодятся:
Остановить сервер
sudo systemctl stop nginx
Запустить сервер
sudo systemctl start nginx
Перезапустить сервер (остановить, затем запустить)
sudo systemctl restart nginx
Перезагрузить сервер (по сути, применить изменения после редакции конфиг-файла без обрыва соединений. Стримы не упадут! Но и не остановятся отдельные каналы, которые вы убрали из конфиг-файла).
sudo systemctl reload nginx
NGINX – RTMP
Теперь можно установить модуль RTMP:
sudo apt install libnginx-mod-rtmp
Готово! Далее необходимо отредактировать конфигурационный файл nginx.conf, в котором и будет указано откуда принимать стрим и по каким адресатам его дублировать.
Подойдет любой текстовый редактор, например nano:
sudo nano /etc/nginx/nginx.conf
Не трогая уже существующее содержимое файла, надо спуститься в самый низ и добавить туда такой блок:
rtmp {
server {
listen 1935;
chunk_size 4096;
allow publish 127.0.0.1;
allow publish ваш_локальный_IP_адрес;
deny publish all;
application live {
live on;
record off;
#TWITCH
push rtmp://hel03.contribute.live-video.net/app/ключ трансляции;
#YOUTUBE
push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
}
}
}
О чем это все:
- listen 1935 – порт, который будет “слушать” rtmp для подключения. 1935 – это стандартный порт.
- chunk_size 4096 – размер блока данных, которые будет отправлять rtmp. По умолчанию, также указан стандартный.
- allow publish – с какого адреса разрешено публиковать стримы. Здесь нужно оставить строчку 127.0.0.1 и добавить свою с IP-адресом вашего VPS (с которого будет идти поток). Можно указать и другие адреса, если нужно. Например, домашний, чтобы запустить стрим из OBS дома, а Nginx, размещенный на VPS, раздавал сигнал дальше.
- deny publish all – запретить публикацию стрима со всех остальных адресов, кроме тех, что были указаны выше.
- application где live можно заменить на любое другое “имя”. Проще говоря, это название/часть адреса “приемника” потока.
Иными словами, если стримить через OBS, то строка rtmp с адресом куда отправить стрим, будет иметь вид навроде: rtmp://localhost/live или rtmp://IP_АДРЕС_VPS/live- live on – включение режима, при котором к потоку могут подключиться одновременно несколько пользователей.
- record off – отключение режима записи, чтобы стримы не сохранялись на диск.
- #ИМЯ_СЕРВИСА – символ “#” служит для комментирования и не влияет на код. А потому очень удобно проименовывать сервисы, чтобы затем не путаться в rtmp-адресах: какой адрес к какой площадке относится.
- push rtmp:// – сюда нужно вставить URL-сервера и ключ-трансляции, которые выдает площадка.
Думаю, что в примере кода это наглядно показано и трудностей не возникнет.
Главное следить за открытием и закрытием “{}” и как ориентир помнить, что в самом низу файла, после текста должно быть три закрывающих фигурных скобки.
В любом случае, бояться не стоит: синтаксис (после сохранения файла) всегда можно проверить командой. Если выдаст ошибку, значит где-то вы пропустили “;” или “{}”.
sudo nginx -t
Также, можно добавить второй “application” с другим набором площадок для рестрима. Это удобно, если есть потребность один стрим проводить, например, только на youtube и twitch, а второй стрим уже только на vkplay и trovo:
rtmp {
server {
listen 1935;
chunk_size 4096;
allow publish 127.0.0.1;
allow publish ваш_локальный_IP_адрес;
deny publish all;
#Первый сетап:
application live {
live on;
record off;
#TWITCH
push rtmp://hel03.contribute.live-video.net/app/ключ трансляции;
#YOUTUBE
push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
}
#Второй сетап:
application live2 {
live on;
record off;
#VKPLAY
push rtmp://vsu.mycdn.me/app/ключ трансляции;
#TROVO
push rtmp://livepush.trovo.live/live/ключ трансляции;
}
}
}
Все, файл можно сохранить и закрыть (для редактора nano – Ctrl+X, подтвердить Y, enter).
Если вы используете Firewall, то надо открыть 1935 порт:
sudo ufw allow 1935/tcp
После чего следует перезагрузить Nginx, чтобы изменения конфиг-файла вступили в силу:
sudo systemctl reload nginx.service
Отлично! Теперь в условный OBS осталось вбить адрес rtmp://ip_вашего_vps/live (помним, что где live – то название, которое мы задали в первой строке application) и запустить стрим.
Поле с ключом можно оставить пустым, либо вписать что угодно, например test – это, по сути ни на что влияет. Просто подключиться к стриму можно напрямую, например, через VLC плеер, где в качестве URL будет: rtmp://ip_вашего_vps/live/test.
RTMPS?
Так как все это заточено под протокол rtmp, то встает вопрос: как рестримить на Kick или Telegram, которые принимают потоки только в rtmps?
Есть обходной путь: запускать их через экземпляр ffmpeg специальной директивой “exec_push” в конфиге Nginx.
Также это помогает в редких случаях, когда площадка поддерживает обычный rtmp, но никак не хочет “цеплять” стрим (подобное у меня было с “Платформой”).
Соответственно, в системе должен быть установлен ffmpeg. Существует масса вариантов его установки, но я полагаю, что стандартный способ тоже подходит:
sudo apt install ffmpeg
Технически, в конфиге Nginx для ffmpeg можно прописывать любые аргументы и параметры, которые он поддерживает. Если вы понимаете как этим пользоваться, то можете смело экспериментировать.
Я же дам пример с копией параметров основного источника – т.к. это проще, понятнее и создает минимальную нагрузку на ЦПУ (1-2%).
Ок. Конфиг. По сути все тоже самое, просто push заменяем на exec_push, указываем путь до исполняемого файла ffmpeg (при корректной установке он всегда одинаковый), адрес основного потока (тот же, что мы указываем при отправке через OBS на наш Nginx-сервер), параметры запуска экземпляра ffmpeg и адрес куда поток отправить:
rtmp {
server {
listen 1935;
chunk_size 4096;
allow publish 127.0.0.1;
allow publish ваш_локальный_IP_адрес;
deny publish all;
application live {
live on;
record off;
#TWITCH
push rtmp://hel03.contribute.live-video.net/app/ключ трансляции;
#TELEGRAM
exec_push /usr/bin/ffmpeg -re -i "rtmp://ip_вашего_vps/live/test" -c copy -f flv "rtmps://dc.rtmp.t.me/s/ключ";
#KICK
exec_push /usr/bin/ffmpeg -re -i "rtmp://ip_вашего_vps/live/test" -c copy -f flv "rtmps://global-contribute.live-video.net/app/ключ";
}
}
}
“rtmp://ip_вашего_vps/live/test” – я указал для лучшей наглядности и т.к. этот пример использовался выше. Иными словами нужно указать для ffmpeg откуда ему брать копию -> с потока который приходит на указанный application в Nginx.
Обратите внимание что выдаваемый KICK’ом набор сервер + ключ трансляции не содержит в себе промежутка “/app/”, – его надо дописать вручную:
<stream_url>/app/<stream-key>
САМОЕ ГЛАВНОЕ: WINDOWS НЕ ПОДДЕРЖИВАЕТ МЕТОД EXEC_PUSH !!!
Это работает только на Linux (Ubuntu в данном случае).
Либо нужные какие-либо дополнительные манипуляции, которые мне неизвестны.
И еще один момент, который может возникнуть (впрочем, это маловероятно, но на всякий случай стоит упомянуть) – отказ ffmpeg запускать свой экземпляр. Тогда попробуйте отредактировать самую первую строчку “user” конфига Nginx, вписав туда имя того пользователя которым устанавливался ffmpeg. Или выдать право всем пользователям запускать файл /usr/bin/ffmpeg, отредактировав его аттрибуты: sudo chmod 755 /usr/bin/ffmpeg
Статистика
Также, в рамках Nginx_RTMP предусмотрена возможность вывода статистики в http-страницу, подобного вида:
На мой взгляд пользы от этого никакой нет: лишь цифры, которые ни на что не влияют. Только лишняя морока с настройкой правил Firewall’а, чтобы никто посторонний не смог зайти на эту страницу…
Для начала, в директории /etc/nginx/sites-available нужно создать файл rtmp :
sudo nano /etc/nginx/sites-available/rtmp
Наполняем этот файл следующим содержимым:
server {
listen 8080;
server_name localhost;
# rtmp stat
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /var/www/html/rtmp;
}
# rtmp control
location /control {
rtmp_control all;
}
}
Теперь нужно извлечь файл stat.xsl в определенную директорию из архива, который скачался вместе с Rtmp-модулем при его установке:
sudo mkdir /var/www/html/rtmp
sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz > /var/www/html/rtmp/stat.xsl`
Если после ввода второй строки, отобразится пустая строка: “>”, нажмите клавишу курсора вверх, чтобы снова вызвать предыдущую команду и нажмите Enter.
Далее надо создать правило для Firewall, чтобы на страницу статистики можно было зайти с определенного IP:
sudo ufw allow from ваш_ip_адрес to any port 8080
Готово! Перейдя по ссылке: http://ip_вашего_vps:8080/stat можно формально отслеживать, что происходит с потоками.
Здесь только остается добавить, что в Ubuntu, по умолчанию, Firewall отключен. И я настоятельно рекомендую изучить его настройку и управление, прежде чем активировать его, и только потом подключать статистику RTMP.
Windows
Чтобы активировать сервер на Windows, нужно скачать пакет с github, который в себя уже включает Nginx и Rtmp-модуль: https://github.com/illuspas/nginx-rtmp-win32
Архив распаковывается в любое удобное место, затем в папке Conf “блокнотом” редактируется файл nginx.conf по тому же принципу, что был описан выше. Разве что в allow publish, можно ничего не добавлять кроме “127.0.0.1”, а в OBS для вывода потока указывать rtmp://localhost/live/.
Чтобы запустить сервер,в корневой папке нужно открыть файл nginx.exe (покажется, что ничего не произойдет, но на самом деле, сервер запустится) и можно начинать стрим.
Для остановки сервера используется исполняемый файл Stop.bat.
Важно понимать, что с перезагрузкой ПК, сервер прекращает свою работу и его нужно запускать снова через nginx.exe.
Если этот материал вам пригодился и у вас есть возможность,
то поддержите автора и сайт небольшим донатом:
Спасибо💛