Рестрим через Nginx для Ubuntu (консоль)

1) Самое главное!

Если перед данной установкой вы пытались сами установить, постарайтесь все удалить, если устанавливали через "sudo apt-get install Nginx", надо все удалить "sudo apt-get remove Nginx"

 

2) Установка необходимых пакетов для Nginx

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

3) Скачиваем Nginx и Nginx-RTMP

Проверяем последнюю версию Nginx, для этого перейдем в браузера по ссылке 
http://nginx.org/download/ и смотрим в самом низу, на момент написание статьи последняя версия "nginx-1.9.9"

Создаем папку куда скачиваем и переходим в нее
mkdir ~/working
cd ~/working
*путь можно указать конкретный, например в моем случае "/usr/build", если оставить все как написано, то пусть будет соответствовать "/root/working/"

Теперь можно скачать необходимые пакеты 

wget http://nginx.org/download/nginx-1.9.9.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

необходимо все распаковать

*если у вас не стоит unzip, надо его установить командой "sudo apt-get install unzip" 

tar -zxvf nginx-1.9.9.tar.gz

unzip master.zip
 

4) Установка Nginx

Переходим в папку с разаархивированным Nginx

cd nginx-1.9.9

добовляем к Nginx с модуль RTMP

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

Компилируем и устанавливаем

make

sudo make install
 

5) Устанавливаем скрипты инициализации 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 в автозапуск

 

6) Теперь можно попробовать запустить Nginx  и проверить что он хотя бы запускается

sudo service nginx start

sudo service nginx stop

*Если при запуске программа ругается что порт 80 уже занят, то быстрее всего у вас стоит Apache, его надо остановить и убрать из авто запуска или в настройках Nginx убрать что бы он не слушал данный порт (потом укажу как это сделать)

 

7) Настройка Nginx  

Редактируем файл конфигурации

sudo nano /usr/local/nginx/conf/nginx.conf
открыв файл мы увидим приблизительно следующее


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #

        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }

    #}

 

Все что начинается с символа # это закомментированные строчки и их пока можно смело удалять

Так же, у кого были проблемы с запуском из за уже используемого 80 порта, то можно так же закомментировать сточку "listen 80;" или поменять на другой порт, например 81.

 

И давайте удалим все нам ненужное, тогда у нас получится следующее


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Теперь самое интересное, настройка rtmp

Добавляем в самый конец файла следующее

rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;

        application myapp {
            live on;
            push rtmp://localhost/GG;
            push rtmp://localhost/YOUTUBE;
            push rtmp://localhost/YOUTUBEBACKUP;
            push rtmp://localhost/TWITCH;
            push rtmp://localhost/CYBERGAME;

        }
        application GG {
                    live on;
                    record off;
                    push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
        }
        application YOUTUBE {
                    live on;
                    record off;
                    push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
        }
        application YOUTUBEBACKUP {
                    live on;
                    record off;
                    push rtmp://b.rtmp.youtube.com/live2?backup=1/ключ трансляции;
        }

        application TWITCH {
                    live on;
                    record off;
                    push rtmp://live-fra.twitch.tv/app/ключ трансляции;
        }
        application CYBERGAME {
                    live on;
                    record off;
                    push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
        }

    }
}

 

с начало создаем сервис на который мы будем стриметь и который будет рестриметь на другие источники "application myapp {", где  myapp его название, которое будем в бивать в настройки OBS или XSplit.

Далее описываем куда будем рестриметь что бы было все красиво 

"push rtmp://localhost/'имя сервиса' "

Теперь создаем сами потоки рестрима для примера GG

        application GG {
                    live on;
                    record off;
                    push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
        }

где самое главное это push rtmp://rtmp сервер/ключ трансляции;

Должно быть все понятно, тут нечего сложного.

 

Настройка секции http для отслеживание потоков

у меня данная секция выследит как то так

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

    server {
        listen       8080;
        server_name  localhost;
        root    /root/working/nginx-rtmp-module-master;
        # sample handlers
        #location /on_play {
        #    if ($arg_pageUrl ~* localhost) {
        #        return 201;
        #    }
        #    return 202;
        #}
        #location /on_publish {
        #    return 201;
        #}

        #location /vod {
        #    alias /var/myvideos;
        #}

        # rtmp stat
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            # you can move stat.xsl to a different location
            root /root/working/nginx-rtmp-module-master;

        }

        # rtmp control
        location /control {
            rtmp_control all;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

тут мы создаем новую секцию server в разделе http , который слушает порт 8080

*если вы программу разархивировали в другую папку, то укажите за место "/root/working/nginx-rtmp-module-master" своие пусть в двух местах.

 

8) Пробуем запускать

sudo service nginx restart

 

если ошибок не было, то значит все сделали правильно 

*если что то не так, читаем ошибки или лезем в логи, логи лежат "/usr/local/nginx/logs/error.log"

 

все работает тогда можно зайти по ссылке "IP адресс машины:8080/stat' и увидите табличку при старте трансляции можно будет увидеть различную информацию.

 

9) Настройка OBS

Для примера покажу настройки OBS.

Тут все совсем просто: нужно указать в качестве сервера наш компьютер.

Для этого лезем в настройки и в настройках Трансляции выбираем Сервер вещания "Custom" и в FMS URL: rtmp://localhost/myapp

где "myapp" это название которое мы указывали в настройках nginx в секции rtmp.

2.jpg

 

На этом основные настройки закончены!

 

По поводу загрузки сервера, то просто рестрим на разные источники процессор вообще не нагружает, НО нагрузка на интернет возрастает многократно и ровна оригинальный битрейт умноженный на количество потоков рестрима.

например, если считать как у меня:

я стримлю в битрейт 2.5 мбит\с и количество потоков рестрима у меня 5 и того исходящий трафик будет равен 12.5 мбит\с, но при моем интернете в 100 мбит это не столь существенно.

Плюс не забывайте повышенные нагрузки на Роутер который у вас стоит дома. У меня стоит хороший zyxel который спокойно все переваривает и я не знаю как с такой нагрузкой справится какой ни будь бюджетный dlink, могу посоветовать только вырубить программу для закачивание торрентов (в моем случае uTorrent)


 

10) Безопасность

Теперь когда все работает, надо подумать о безопасности, что бы не кто не мог стриметь кроме вас на ваш сервер.

Для этого создадим белые IP адреса, с которых можно стриметь 

для этого в секции в настройках Nginx (/usr/local/nginx/conf/nginx.conf) в секции rtmp нам нужно кое что дописать.

В каждом application нудно добавить следующие настройки:

                    allow publish 127.0.0.1; # локальный адрес
                    allow publish 192.168.1.13; # ip адрес ПК с которого будет идти стрим
                    allow publish 83.153.39.122; # адрес с которого будет идти стрим в не дома
                    deny publish all; # Запретить все остальные

вот так выглядят полностью мои настройки /usr/local/nginx/conf/nginx.conf

rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;

        application myapp {
            live on;

            allow publish 127.0.0.1; 
            allow publish 192.168.1.13; 
            allow publish 83.153.39.122; 
            deny publish all;
            push rtmp://localhost/GG;
            push rtmp://localhost/YOUTUBE;
            push rtmp://localhost/YOUTUBEBACKUP;
            push rtmp://localhost/TWITCH;
            push rtmp://localhost/CYBERGAME;

        }
        application GG {
                    live on;
                    record off;

                    allow publish 127.0.0.1; 
                    allow publish 192.168.1.13; 
                    allow publish 83.153.39.122; 
                    deny publish all;
                    push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
        }
        application YOUTUBE {
                    live on;
                    record off;

                    allow publish 127.0.0.1; 
                    allow publish 192.168.1.13; 
                    allow publish 83.153.39.122; 
                    deny publish all;
                    push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
        }
        application YOUTUBEBACKUP {
                    live on;
                    record off;

                    allow publish 127.0.0.1; 
                    allow publish 192.168.1.13; 
                    allow publish 83.153.39.122; 
                    deny publish all;
                    push rtmp://b.rtmp.youtube.com/live2?backup=1/ключ трансляции;
        }

        application TWITCH {
                    live on;
                    record off;

                    allow publish 127.0.0.1; 
                    allow publish 192.168.1.13; 
                    allow publish 83.153.39.122; 
                    deny publish all;
                    push rtmp://live-fra.twitch.tv/app/ключ трансляции;
        }
        application CYBERGAME {
                    live on;
                    record off;

                    allow publish 127.0.0.1; 
                    allow publish 192.168.1.13; 
                    allow publish 83.153.39.122; 
                    deny publish all;
                    push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
        }

    }
}

теперь перезапускаем наш сервер и все должно прекрасно работать

sudo service nginx restart


 

11) Настройка перекодировке видео потока.

В первую очередь нам понадобится программа перекодировки, для этого установим ее

sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next
sudo apt-get update
sudo apt-get install ffmpeg

*apt-add-repository команды в неклльлоых случаях не могут устновить, тогда выполняем команду sudo apt-get install software-properties-common

 

12) Настойка Nginx-RTMP и FFmpeg

Открываем конфигурационный файл Nginx 

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

и в секциях для рестрима меняем push на exec ffmpeg

В примере покажу для плеера CYBERGAME 

        application CYBERGAME {
                    live on;
                    record off;

                    allow publish 127.0.0.1; 
                    allow publish 192.168.1.13; 
                    allow publish 83.153.39.122; 
                    deny publish all;

                    exec ffmpeg -i rtmp://localhost/myapp -vcodec libx264 -preset veryfast -b:v 2000k -maxrate 2000k -bufsize 2000k -s 1280x720 -sws_flags lanczos -r 30 -acodec copy -f flv rtmp://st.cybergame.tv:1953/live/ключ трансляции;


                    #push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
        }

Тут все несложно и понятно, но если в пару словах данный скрипт преобразовывает входящий поток в поток 720р с постоянным битрейтом 2000к с изменением размера с использованием алгоритма Ланцоша и частотой кадров 30 к/с. Аудиопоток остается без изменений.

*для разных плэеров м.б. понадобятся дополнительные параметры например -libx264opts keyint=60

 

По поводу нагрузки на процессор!

Перекодировка съедает очень много ресурсов процессора, сама нагрузка зависит от параметров и количество рестримов с перекодировкой!

У меня сервер двух ядерный с частотой 2,6 и при данной настройке один поток с перекодировкой съедает приблизительно 20-25% всей мощности процессора

и при 4 потоков (изначально у меня было только 4) у меня съедало 80-100% процессора, то не очень хорошо.

Но есть хорошая новость, можно сэкономить если перекадировку делать не в каждом канале, а в основной секции и потом уже готовый поток распределять по каналам.

Тогда например одни поток сделать на ютуб и на твич, а на другие плэера другой поток.

Должно получится как то так:

rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;
        application myapp {
            live on;
            allow publish 127.0.0.1; 
            allow publish 192.168.1.13; 
            allow publish 83.153.39.122; 
            deny publish all;
            push  rtmp://localhost/1080p;
            exec ffmpeg -i rtmp://localhost/myapp -vcodec libx264 -preset veryfast -b:v 2000k -maxrate 2000k -bufsize 2000k -s 1280x720 -sws_flags lanczos -r 30 -acodec copy -f flv rtmp://localhost/720p;
            exec ffmpeg -i rtmp://localhost/myapp -vcodec libx264 -preset veryfast -b:v 1500k -maxrate 1500k -bufsize 1500k -s 640x480 -sws_flags lanczos -r 30 -acodec copy -f flv  rtmp://localhost/480p;
        }
        application 1080p {
                    #server youtube
                    live on;
                    record off;
                    allow publish 127.0.0.1; 
                    allow publish 192.168.1.13; 
                    allow publish 83.153.39.122; 
                    deny publish all;
            push rtmp://a.rtmp.youtube.com/live2/ключ трансляции;
            push rtmp://b.rtmp.youtube.com/live2?backup=1/ключ трансляции;
                    
        }
        application 720p {
                    #server GG and cybergame
                    live on;
                    record off;
                    allow publish 127.0.0.1; 
                    allow publish 192.168.1.13; 
                    allow publish 83.153.39.122; 
                    deny publish all;
                    push rtmp://msk.goodgame.ru:1940/live/ключ трансляции;
                    push rtmp://st.cybergame.tv:1953/live/ключ трансляции;
        }
        application 480p {
                    #server twith
                    live on;
                    record off;
                    allow publish 127.0.0.1; 
                    allow publish 192.168.1.13; 
                    allow publish 83.153.39.122; 
                    deny publish all;
                    push rtmp://live-fra.twitch.tv/app/ключ трансляции;
        }
    }
}

Тут мы получаем следующее:

"push  rtmp://localhost/1080p;"

оригинальный битрейт мы напрямую шлем в секцию "application 1080p" на сервера youtube (предположим мы стримем в 1080p и 3,5 Битрейт , тогда там будет такой поток)

"exec ffmpeg -i rtmp://localhost/myapp -vcodec libx264 -preset veryfast -b:v 2000k -maxrate 2000k -bufsize 2000k -s 1280x720 -sws_flags lanczos -r 30 -acodec copy -f flv rtmp://localhost/720p;"

дальше мы оригинальный поток преобразуем в 720p и 2,0 Битрейт и отправляем в секцию application 720p, где он отправляется на сервера гудгейма и кибергейма

exec ffmpeg -i rtmp://localhost/myapp -vcodec libx264 -preset veryfast -b:v 1500k -maxrate 1500k -bufsize 1500k -s 640x480 -sws_flags lanczos -r 30 -acodec copy -f flv  rtmp://localhost/480p;

И далее мы оригинальный поток перекодируем в 480p и 1,5 Битрейт и отправляем в секцию application 480p  где он иден на Твич

*480р я добавил просто для примера

**Данный код я не проверял, но по идеи все доложно работать, если что пишите, чем смогу тем помогу

 В итоге у нас на 4-5 разных потоков, а всего 3 из которых 2 мы перекадируем и того у нас общая загрузке должна быть не больше 50%

 


На этом все. Всем удачи в настройке!


Настройка Nginx под windows можно найти тут

http://goodgame.ru/topic/74992/