Решили стримить 1080р с поднятием битрейта, но зрители оказались нищебродами и у них лагает? Стримили 5 лет, но так и не прошли конкурс на получение партнерки? Получили партнерку на твиче, но он оказался говном? Ваш любимый и никому не известный сервис не умеет делать рестрим на нужный вам ресурс? Нашли похожую тему, но автор забил на хостинг и подробное описание?
Не вешайте нос, решение есть у нас!
Использование nginx-rtmp (и ffmpeg) для нескольких потоков с одним или разным качеством.
0. Требования к оборудованию и Интернет.
Для обычного рестрима на несколько ресурсов без перекодирования потребуется пропускная способность, равная сумме битрейтов + 20% для однозначного перекрытия служебного трафика и спайков. На пальцах: хочется стримить 4к поток на два сервиса - запасайтесь интернетами не меньше 10 мбит.
Для рестрима с реэнкодингом помимо вышеуказанного условия потребуется запас по мощности процессора. Реэнкодинг занимает приблизительно 0.6-0.75 от процессорного времени основного стрим-процесса, а забирать его придется от остальных процессов, в том числе и самой игры, поэтому возможно небольшое снижение fps.
1. Приступаем к настройке. Скачиваем скомпилированный с rtmp-модулем nginx, например, отсюда.
Распаковываем в удобное место (я рекомендую класть в корень диска C, во избежание проблем с путями).
Создаем в папке nginx\conf файл nginx.conf (прожженые it-спецы, использующие nginx под виндой в качестве боевого сервера просто открывают этот файл ) и в него пишем нечто, похожее на:
Далее, нужно протестировать настройки и попытаться запустить nginx. Открываем командную строку, переходим в папку nginx и пишем nginx -t, жмем Enter. Наша цель - получить следующие сообщения:#user nobody;
# multiple workers works !
worker_processes 1;
#error_log logs/error.log;
error_log c:/nginx/logs/error.log debug;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 8192;
}
rtmp {
server {
listen 1935;
chunk_size 8192;
application fullhd { #название может быть изменено по вашему желанию
live on;
push <your_stream_path>/<your_stream_key>;
push <your_stream_path2>/<your_stream_key2>;
#по желанию добавляете дополнительные сервисы
}
}
}
Если выводит нечто другое - вчитываемся в ошибку, пытаемся исправить (обычно это не поставленная точка с запятой или забытая скобка).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. Командная строка зависнет - это нормально. Чтобы корректно остановить, можно запустить вторую командную строку, перейти в папку nginx, набрать nginx -s stop. Или просто некорректно вырубить из диспетчера задач процесс.
2. Настраиваем стрим-программу. Тут все совсем просто: нужно указать в качестве сервера наш компьютер. То есть в OBS получается примерно так:
На этом, собственно, настройка рестримов закончена. Просто запускаете стрим и смотрите, куда у вас уходит поток. Если куда то поток не доходит, проверяйте fms url для данного сервиса в конфиге nginx.
3. Настройка реэнкодинга.
Для этого нам понадобится ffmpeg. Берем его примерно отсюда, выбирая правильную разрядность и shared версию, в которую напихано "все и сразу". Таким же макаром распаковываем в любое удобное для вас место (тут уже можно не в корень, ffmpeg не такой неженка). Затем лично я предпочитаю сразу добавить его в переменные окружения, дабы не париться с путями. Это делается через свойства компьютера - дополнительные параметры системы - переменные окружения на первой же вкладке - добавляем в системную переменную Path путь до папки с ffmpeg. Добавляем, а не заменяем все переменные вообще!
Далее правим конфиг nginx, добавляя следующий блок:
Добавляется он прямо под предыдущий блок application.application hd {
live on;
push <your_stream_url3>/<your_stream_key3>;
}
Делаем nginx -s reload (помните про командную строку?) и тест настроек. Впрочем, при reload'e nginx сам сделает тест.
Теперь нам нужно накалякать пакетный файл для реэнкодинга, ибо виндовый nginx еще не умеет exec
Создаем текстовый файл приблизительно следующего содержания:
Пытливые умы быстро разберутся что здесь к чему, а для лентяев поясню: данный скрипт преобразовывает входящий поток в поток 720р с постоянным битрейтом 2000к с изменением размера с использованием алгоритма Ланцоша и частотой кадров 30 к/с. Аудиопоток остается без изменений. Внимание: для твича и ютуба необходимо добавить опцию -libx264opts keyint=60, где 60 - частота кадров видео помноженная на 2.ffmpeg -i rtmp://localhost/fullhd -vcodec libx264 -preset veryfast -b:v 2000k -maxrate 2000k -bufsize 2000k -s 1280x720 -sws_flags lanczos -r 30 -acodec copy -f flv rtmp://localhost/hd
Сохраняем файл как ffmpeg to hd.bat в любое удобное место. Теперь, чтобы начать рестрим с реэнкодингом достаточно запустить основной стрим, а затем этот файл. Измененный поток пойдет на выбранный вами плеер. Чтобы потестить правильность настроек, я рекомендую поменять разрешение в bat-файле на квадратное (или ширкоформатное, если основной поток идет в 4:3), ибо с первого взгляда сложно определить где основной поток, а где измененный.
4. Автоматизация запуска.
Разумеется, постоянно пускать nginx через консоль не совсем удобно. Поэтому катаем скрипты
nginx-start.bat - для старта
nginx-reload.bat - для применения изменения конфигов@ECHO OFF
set root=C:\nginx
cd /D %root%
start nginx.exe
nginx-stop.bat - для остановки@ECHO OFF
set root=C:\nginx
cd /D %root%
nginx.exe -s reload
При этом, nginx-start.bat можно положить в автозагрузку.@ECHO OFF
set root=C:\nginx
cd /D %root%
nginx.exe -s stop
5. Разумеется, под линухом все будет красивее, не нужны скрипты, ffmpeg можно обернуть прямо в конфиге nginx'а, да и вообще linux power.
В общем то на этом все, пробуйте, пинайте за недочеты. Кто знает, как корректно запихнуть nginx в сервисы винды (а то он у меня на пути ругается ) - напишите, будете молодцом.
Копипастеры с танков, блин, если уж спираете статью, то хотя бы авторство указывайте.
Основные идеи почерпнуты из этих статей