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

То просто подотрите полностью секцию 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
Одной командой мы отправим поток со своего сервера в вк и инстаграм.