Как создать свой стриминг сервер на VPS
Для создания своего стриминг сервиса вам потребуется 2 компонента: RTMP сервер, и сервер раздачи контента. Сделать все это позволяет nginx-rtmp-module. Этот RTMP модуль для сервера nginx позволяет вам создать RTMP сервер, который затем превращает видео поток в чанки например HLS или DASH, которые можно проигрывать в любимом плеере.
Для хостинга рекомендуется использовать VPS сервер, тк потоковое видео создаёт большую нагрузку на сеть.
Установка
Код ниже можно просто скопировать и вставить в терминал тк комментарии игнорируются башем.
# Установка зависмостей
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
# Скачивание nginx
wget http://nginx.org/download/nginx-1.15.1.tar.gz
# Распаковка tar
tar -zxvf nginx-1.15.1.tar.gz
# Заходим в папку с исходниками nginx
cd nginx-1.15.1
# Теперь скачаем плагин
wget https://github.com/sergey-dryabzhinsky/nginx-rtmp-module/archive/dev.tar.gz
tar -zxvf dev.tar.gz # Распаковка плагина
# Создаем Makefile
./configure --with-http_ssl_module --add-module=nginx-rtmp-module-dev
# Компилируем и ставим на систему
make
sudo make install
cp objs/nginx /usr/sbin/nginx
Теперь нужно настроить nginx, и запустить. Сразу удалим заводской конфиг nginx, тк нам придется сейчас много что переписывать: rm /usr/local/nginx/conf/nginx.conf
Далее нужно создать сервис файл для nginx в systemd, чтобы можно было настроить nginx как демон. Создаем этот файл /lib/systemd/system/nginx.service:
[Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/usr/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
После создания демон-файла нужно обновить регистр демонов Systemd: sudo systemctl daemon-reload
Настройка
Открываем /usr/local/nginx/conf/nginx.conf в любимом текстовом редакторе и вводим этот конфиг:
events {}
rtmp {
server {
listen 1935;
chunk_size 4000;
application mytv {
live on;
allow publish 127.0.0.1; # Здесь нужно ввести свой IP, который можно получить из 2ip.ru.
deny publish all;
allow play all;
hls on;
hls_path /tmp/hls;
}
}
}
http {
server {
listen 8080;
location /hls {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
}
}
В большинстве статей которые я находил забывают добавить events{} в конфиге, из-за чего nginx не запускался. Теперь разберемся что делает наш конфиг: Конфиг создаёт RTMP стрим с именем mytv, где указывается что стрим можно принимать только от 127.0.0.1 так сделано чтобы неизвесные люди из интернета не могли перехватить ваш стрим. Далее мы настраиваем директорию /tmp/hls как место для хранения кусков вашего стрима, которые будут развадатся через протоков HLS. Тк файлы находятся в /tmp, то файлы находятся в оперативной памяти. Это позволяет быстрее образатся к ним, и раздать клиентам. Ниже мы настраиваем уже http сервер который просто раздаёт все файлы находящиеся в директории /tmp.
Так же нужно использовать SSH тунелирование, чтобы вы могли от имени 127.0.0.1 подключится к порту 1935:
ssh -f -N -L 1935:192.168.0.10:1935 nameuser@88.77.66.55
Так-же желательно запретить доступ к порту 1935 из внешней сети. Но это уже можно делать на ваше усмотрение.
Теперь нужно запустить nginx через Systemd:
sudo service nginx start
Если у вас пояились какие-либо ошибки, отпишитесь пожалуйста в комментариях, я вам обязательно помогу.
Стриминг через OBS
Чтобы стримить на свой стриминг серис вам нужно зайти на вкладку Stream в OBS, и нажать "Custom". Как URL стрима нужно ввести: rtmp://127.0.0.1:1935/mytv ключа трансляции нету.
Затем нажмите "Начать стрим", и не должно быть dropped frames, и индикатор должен быть зеленым:
Теперь если вы зайдете в директорию ls -la /tmp/hls то увидите чати стрима, и HLS плейлист:
Если вы зайдёте на страницу http://localhost:8080/hls/.m3u8, то увидите плейлист:
Его можно использовать в веб плеерах вроде videojs, https://flowplayer.com/ VLC, и многих других.
Чтобы сделать стрим более масштабируемым можно использовать CDN вроде clouflare. Никогда такого не делал, но скорее всего в следующих статьях попробую сделать.
У nginx-rtmp-module так-же есть поддержка вебхуков. Позже я так же напишу пост про их интеграцию для рассылок уведомлений о начале трансляции итд. Пишите в комментариях вопросы, я обязательно на них отвечу и помогу вам.
Какая пропускная способность должна быть у VPS, чтобы стримить в качестве 1080р на одного человека?
ОтветитьУдалитьНа одного человека думаю любой vps подойдёт с парой ядер и 100 мегабайт.
УдалитьА как поставить пароль?
ОтветитьУдалитьПароль на HLS, или RTMP поток?
УдалитьRtmp
УдалитьА можем перейти в месенждер
ОтветитьУдалитьКакие характеристики сервера должны быть для стрима на 10-20к зрителей ? У меня на 250 человек плеер умирает)
ОтветитьУдалитьВсе очень индивдуально и нужно бенчмаркать. Если умирает значит скорее всего не хватает ширины канала. Надо настроить кеш сеть.
Удалить