Трансляция одновременно в несколько соцсетей с помощью Nginx+RTMP

Трансляция одновременно в несколько соцсетей

Данное решение позволяет решать массу задач, в том числе и рестрим на несколько платформ. Передо мной же стояла задача сделать так, чтобы можно было запустить одновременно несколько трансляций в одноклассниках. Поскольку в одноклассниках есть возможность вести трансляцию с помощью отправки потока на сервер или же указания ссылки на поток. Именно второй вариант меня и заинтересовал.

OBS позволяет нам отправлять поток на сервер, причем только один поток. И если нам надо вести две и более трансляций, то мы упираемся именно в эту особенность того же OBS. Стоит отметить что OBS и не должен решать этих задач, у него совсем другие задачи. Задачу распараллеливания потока мы должны решить сами. Самым простым и изящным решением является Nginx с модулем RTMP.

Этот вариант позволяет нам не только раздавать поток, то есть pull, но и перенаправлять, то есть делать push. Решение более чем универсальное. Осталось только разобраться в некоторых моментах и освоить не хитрые инструменты.

В качестве сервера я выбрал VDS. У меня конечно есть домашний сервер, но во-первых: он занят другими задачами, во-вторых: не охота было заморачиваться подключением статично IP. Тем более VDS (или VPS, это одно и то же) более шутрая вещь, чем старый системник, несмотря на гораздо большие ресурсы. Тем более все что касается стримов, все сопровождается большими нагрузками на сетевое оборудование. Тут очень критично не только сколько мегабит у вас по тарифу, но и возможности роутера. Именно роутер иногда является слабым звеном в этой цепочке.

Если нет необходимости раздавать поток, а только пушить, то сервер можно поднять на виртуалбоксе, если позволяют ресурсы компьютера. Виртуалбокс хорош тем, что можно сделать снимок, считай бэкап, и пробовать настраивать сервер. Допустил ошибку? Не беда, восстановил снимок и начал с начала. Не надо ничего переустанавливать. Для новичка лучше и не придумаешь.

Но помните про нагрузку на сеть, не увлекайтесь сильно.

Содержание

Установка Nginx

Самая сложная часть, это сборка пакета для установки. Осложняется этот процесс тем, что на этапе сборки могут возникать все возможные ошибки какие только можно придумать. Радует что такие случаи довольно редки. И в этом случае, если все выполнять не отклоняясь от инструкции, то все должно пройти как по рельсам. Приступая к установке мы подразумеваем что у нас уже есть сервер с Ubuntu Server на борту. Желательно Ubuntu 20.04. Если у вас VDS и для авторизации используете логин root, то советую создать другого пользователя, а root деактивировать.

Первым делом устанавливаем вспомогательные пакеты.

sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

Качаем свежий дистрибутив Nginx

wget http://nginx.org/download/nginx-1.21.0.tar.gz

На момент написания статьи самая свежая версия Nginx 1.21.0.

Сразу же качаем архив с модулем.

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

Распаковываем архив с Nginx.

tar -zxvf nginx-1.21.0.tar.gz

Распаковываем архив с модулем.

unzip master.zip

Переходим в папку с Nginx.

cd nginx-1.21.0

Добавляем к Nginx модуль RTMP и запускаем команду.

./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master

Затем выполняем

make

Если все прошло без ошибок, то тут же выполняем

sudo make install

Если все прошло без ошибок, значить nginx успешно установлен.

Теперь нам надо обеспечить автозапуск Nginx. Для этого скачаем скрипт для управления запуском Nginx.

sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx

Делаем файл выполняемым

sudo chmod +x /etc/init.d/nginx

Добавляем скрипт в автозапуск

sudo update-rc.d nginx defaults

Теперь пробуем запускать Nginx

sudo service nginx start

Настройка Nginx

Первым делом сохраним исходный файл конфигурации.

sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bckp

А теперь открываем файл и редактируем.

sudo nano /usr/local/nginx/conf/nginx.conf

Подтираем все, что закомментировано, то есть все строки, которые начинаются с #. Нещадно. В редакторе nano удалить строку целиком можно сочетанием клавиш Ctrl+K. Затем добавляем секцию отвечающую за rmtp.

worker_processes  1;

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

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Если вам нет нужды лицезреть классическое приветствие Nginx

Приветствие Nginx

То просто подотрите полностью секцию http оставив только rtmp. Как то так:

worker_processes  1;

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

events {
    worker_connections  1024;
}

Сервер не будет обрабатывать запросы по http и тем самым будет затрачивать меньше ресурсов.

Настроили, перезапускаем Nginx

sudo service nginx restart

Или просто перезагружаем конфигураци

sudo /usr/local/nginx/sbin/nginx -s reload

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

Как работает сервер RTMP

Мы с вами создали секцию rtmp, в ней секция server, а уже в секции server секция application. В моем случае секция application называется live. Что это значит? Это значит что в настройках того же OBS мне надо будет в качестве сервера указать rtmp://<server_ip>/live, а в качестве ключа любое значение. Например camera_1. Тогда этот поток будет доступен по ссылке rtmp://<server_ip>/live/camera_1. Таким образом можно создавать кучу разных потоков формируя разные ключи.

Это как раз важно для случаев, когда можно указать адрес сервера с потоком. Как при добавлении трансляции в одноклассниках.

Добавление трансляции в одноклассниках
Добавление трансляции в одноклассниках

Таким образом можно вести несколько трансляций в одноклассниках просто указывая ссылку на поток. Именно эту задачу мне нужно было решить и сервер Nginx с RTMP подошел для этого как нельзя лучше. Тем более мне нравится Nginx и я давно с ним знаком.

Как работает рестрим

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

К примеру если мы добавим в секцию application команду push

rtmp {
        server {
                listen 1935;
                application live {
                        live on;
                        record off;
                        push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
                }
        }
}

То как только мы направим поток на наш сервер, он тут же начнет гнать его на сервер, который указан после команды push. Причем не важно с каким ключем трансляция. То есть направляя поток на rtmp://<server_ip>/live/camera_1 и на rtmp://<server_ip>/live/camera_2, сервер будет гнать оба этих потока на rtmp://a.rtmp.youtube.com/live2/ключ трансляции. Честно говоря я не проверял как сервер будет вести себя при направлении двух и более потоков.

Допустим нам нужно разделять потоки. трансляцию с ключом camera_1 гнать на rtmp://a.rtmp.youtube.com/live2/key_1, а camera_2 гнать на rtmp://a.rtmp.youtube.com/live2/key_2, то для этого есть специальный параметр name, который нужноуказать после URL сервера.

rtmp {
        server {
                listen 1935;
                application live {
                        live on;
                        record off;
                        push rtmp://a.rtmp.youtube.com/live2/ключ трансляции name=camera_2;
                }
        }
}

Таким образом мы застолбили отдельно взятую трансляцию за отдельно взятым ключом.

Ещё один способ рестрима

Именно этим способом я как раз и пользуюсь.Суть этого способа заключается в том, что сервер RTMP принимает и соответственно раздает поток. С помощью FFMPEG поток берется с сервера и отправляется на трансляцию в соцсети.

Команда выглядит вот так:

ffmpeg -i "rtmp://22.222.55.111/live/360live" -vcodec libx264 -preset:v ultrafast -acodec aac -f flv "rtmp://ovsu.mycdn.me/input/6979879873_209987987766_43_jgfz7ucjo"

Как видите, FFMPEG берет поток с сервера и отправляет его на трансляцию вконтакте. Количество процессов FFMPEG ограничено только пропускной способностью сети и мощностью компьютера. Если нам нужно отправить поток на Youtube, вконтакт, Twitch, Twitter. Нам нужно запустить FFMPEG с несколькими аргументами -f flv «rtmp-server» где rtmp-server — это сервер трансляции в соцсети.

Получится примерно такая команда:

ffmpeg -i "rtmp://22.222.55.111/live/360live" -vcodec libx264 -preset:v ultrafast -acodec aac -f flv "rtmp://ovsu.mycdn.me/input/6979879873_209987987766_43_jgfz7ucjo" -f flv "rtmps://live-upload.instagram.com:443/rtmp/179476576500565246?s_sw=0&s_vt=ig&a=AbxРпнгТРwgO57Vo

Одной командой мы отправим поток со своего сервера в вк и инстаграм.

На сайте отсутствует реклама

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

Номер карты

Заранее спасибо!

Бидюков Денис

Эксперт по сайтам

Занимаюсь продвижением личного бренда с помощью сайта и SEO. Если Вы хотите из обычного сантехника, электрика, врача или фотографа стать востребованным и высокооплачиваемым  специалистом, то я с легкостью Вам помогу.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *