Как создать свой стриминг сервер на 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, то увидите плейлист:
Его можно использовать в веб плеерах вроде videojshttps://flowplayer.com/ VLC, и многих других.

Чтобы сделать стрим более масштабируемым можно использовать CDN вроде clouflare. Никогда такого не делал, но скорее всего в следующих статьях попробую сделать.

У nginx-rtmp-module так-же есть поддержка вебхуков. Позже я так же напишу пост про их интеграцию для рассылок уведомлений о начале трансляции итд. Пишите в комментариях вопросы, я обязательно на них отвечу и помогу вам.

Комментарии

  1. Какая пропускная способность должна быть у VPS, чтобы стримить в качестве 1080р на одного человека?

    ОтветитьУдалить
    Ответы
    1. На одного человека думаю любой vps подойдёт с парой ядер и 100 мегабайт.

      Удалить
  2. А можем перейти в месенждер

    ОтветитьУдалить

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

Популярные сообщения из этого блога

DOS атака при помощи Python

Как исправить ошибку "Notreadableerror: could not start video source" в javascript

Ведем телеграм канал через питон