Nginx + rtmp. трансляция видео с веб-сервера. установка и настройка nginx-rtmp-module

Nginx ,Nginx-Rtmp-Module & Ffmpeg Build Live Video Streaming Server

This document is setup development enviroment on MacOs. For other Linux such at Ubuntu cloud server we will do later on Deployment task. Watch video here

We need nodejs for development and run backend resful service , websocket server so to install Node.js just download this package from officical website https://nodejs.org/en/download/

This tutorial we are using Mongodb NoSQL database store document for our Node.js app. To instlal MongoDB just download https://www.mongodb.com/download-center?jmp=nav#community or use Home brew https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/

We use home brew to install package if you dont have Home brew just see documentation to install home brew on your MacOs https://brew.sh/

brew tap homebrew/nginxbrew options nginx-fullbrew info nginx-fullbrew install nginx-full —with-rtmp-module —with-debug

Nginx config file for default in /usr/local/etc/nginx/nginx.conf

Start Nginx

nginx

Stop Nginx

nginx -s stop

Reload Nginx

nginx -s reload

Ffmpeg that is awesome and free tools for video converting, streaming, we will use this tool for stream video from a camera (on Raspberry Pi Zero W) and send stream video from camera to our Server or Youtube.

for development we use it on Mac for testing and just stream a video source from a input movie .mkv format. We can download and install package directly from official website https://www.ffmpeg.org/download.

html or use Home brew to install it on MacOs.

brew install ffmpeg

Or Install with extra resources (Plugins)

brew install ffmpeg —with-tools —with-fdk-aac —with-freetype —with-fontconfig —with-libass —with-libvorbis —with-libvpx —with-opus —with-x265

Update Ffmpeg to latest version

brew update && brew upgrade ffmpeg

Documentation for list all inputs videos/audios https://www.ffmpeg.org/ffmpeg-devices.html On MacOs

ffmpeg -f avfoundation -list_devices true -i «»

Stream Camera on MacOs + Audio to rtmp server ,remember change frame rate correctly in my iMac it: -r 30

ffmpeg -f avfoundation -r 30 -i «0:0» -deinterlace -vcodec libx264 -pix_fmt yuv420p -preset medium -g 60 -b:v 2500k -acodec libmp3lame -ar 44100 -threads 6 -qscale 3 -b:a 712000 -bufsize 512k -f flv rtmp://localhost/live/tabvn

Stream a movie (video.mkv) to Nginx Rtmp Server eg: rtmp://localhost/live/tabvn , that mean you can stream a video/camera to your Youtube live channel by replace the rtmp url with your rtmp://a.rtmp.youtube.com/live2/[stream-name-key]

ffmpeg -re -i video.mkv -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv rtmp://localhost/live/tabvnworker_processes auto;

events {
worker_connections 1024;
}

# RTMP Config

rtmp {
server {
listen 1935; # Listen on standard RTMP port
chunk_size 4000;
application live{
live on;
deny play all;
push rtmp://localhost/play;
on_publish http://localhost:3001/api/on-live-auth;
on_publish_done http://localhost:3001/api/on-live-done;
}
application play {
live on;
# Turn on HLS
hls on;
hls_nested on;
hls_fragment_naming system;
#hls_path /Users/toan/Sites/mnt/hls/;
hls_path /Users/toan/Tutorials/stream/storage/live/;
hls_fragment 3;
hls_playlist_length 60;

# disable consuming the stream from nginx as rtmp
deny play all;
}
}
}
# End RTMP Config

http {

default_type application/octet-stream;
sendfile off;
tcp_nopush on;

server {
listen 3002;

location /live {

# Disable cache
add_header Cache-Control no-cache;

# CORS setup
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length';

# allow CORS preflight requests
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}

types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}

root /Users/toan/Tutorials/stream/storage/;

}
}

include servers/*;
}

Источник: https://hackernoon.com/nginx-nginx-rtmp-module-ffmpeg-build-live-video-streaming-server-88a52f7bab6f

Rtmp видео стример для трансляции видео с IP камеры на несколько плееров

Необходимо подготовить компьютер, который будет являться стримером rtmp потока на плееры.

Для трансляции видео с одной камеры подойдет практически любой компьютер, например с мы использовали компьютер со следующие конфигурацией:

Intel Dual-Core Processor J1800

DDR3 — 2Гб

HDD или SDD — можно использовать любой HDD или SDD диск на который можно установить OS linux Ubuntu

Компьютер должен быть подключен к сети в которой есть работающий DHCP сервер(или если такого сервера нет, то нужно настроить сетевой адрес, прописать маску и шлюз), сеть к которой подключен компьютер имеет доступ в Интернет

1) Устанавливаем OS Ubuntu на компьютер

Мы установили Ubuntu 16.04, также можно установить Ubuntu 14.04, с другими версиями установка и работа стримера не проверялась.
Как установить Ubuntu — пожалуйста посмотрите процесс установки в интернет.

Дальнейшую установку можно проводить открыв программу «Terminal» на компьютере или удаленно, например, по ssh с помощью программы putty.
для этого нужно установить службу ssh на компьютер с OS Ubuntu выполнив команду

sudo apt install openssh-server

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

Предполагается что ранее ngnix на компьютер не устанавливался, иначе его нужно удалить
Устанавливаем пакеты

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

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

Нужно проверить какая последняя версия Nginx существует сейчас, открываем в браузере ссылку
http://nginx.org/download/ и смотрим в самом низу, на момент написания статьи последняя версия была «nginx-1.14.0»

Создаем папку куда будут загружаться пакеты и переходим в нее

mkdir ~/working cd ~/working

Скачиваем необходимые пакеты

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

Теперь необходимо распаковать
Если у вас установлен unzip, надо его установить командой

sudo apt-get install unzip

Выполняем команды

tar -zxvf nginx-1.14.0.tar.gz unzip master.zip

4) Устанавливаем Nginx

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

cd ./nginx-1.14.0

добавляем к 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.

Дописываем в конец файла следующий текст : rtmp {     server {         listen 1935;         application cam1 {             live on;             exec_static ffmpeg -i rtsp://admin:admin@192.168.0.12:554/Streaming/Channels/1/ -c copy -f flv rtmp://127.0.0.

1/cam1/stream;         }     } }

rtsp://admin:admin@192.168.0.12:554/Streaming/Channels/1/ — это пример rtsp потока с камеры — его нужно заменить на rtsp поток с вышей камеры, например для камеры Axis этот поток может выглядеть так:
rtsp://192.168.117.105:554/axis-media/media.

amp?streamprofile=Bandwidth

8) Установка FFmpeg и проверка его работы

Для того, чтобы мы смогли конвертировать поток rtsp в fvl, понадобится ffmpeg.
Подключаем репозитории FFmpeg и ставим его:

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

9) Пробуем перезапустить сервер, после перезагрузки все должно работать

sudo service nginx restart

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

rtmp://ip_adress_servera/cam1/stream
Мы увидим картинку с нашей ip камеры

Если не работает, то читаем ошибки или лезем в логи «/usr/local/nginx/logs/error.log»

10) Загрузка процессора компьютера

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

11) Если нужно показывать картинку с нескольких камер, то
открываем файл

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

и находим строчку с «worker_process» и исправляем

worker_processes auto;

В корень конфигурационного файла добавляем

rtmp_auto_push on;

теперь в конец файла нужно добавить,

rtmp {     server {         listen 1935;         application cams {             live on;         }         exec_static ffmpeg -i rtsp://admin:admin@192.168.0.12:554/Streaming/Channels/1/ -c copy -f flv rtmp://127.0.0.1/cams/stream1;         exec_static ffmpeg -i rtsp://admin:admin@192.168.0.13:554/Streaming/Channels/1/ -c copy -f flv rtmp://127.0.0.1/cams/stream2;     } }

где rtsp://admin:admin@192.168.0.12:554/Streaming/Channels/1/ — поток с одной из камер

rtsp://admin:admin@192.168.0.13:554/Streaming/Channels/1/ — поток с другой камеры

Источник: http://keenvision.ru/support/esli-server-s-po-ne-vidit-pleer-itms/kak-sdelat-rtmp-video-strimer-dlya-transl/

Настройка и установка сервера для видео

Для того, чтобы установить nginx с mp4 streaming module на Debian 9, необходимо выполнить следующую команду:

Если у Вас ранее уже была установлена другая версия nginx и её необходимо удалить, выполните эту команду:

Для того, чтобы синхронизировать два сервера, необходимо выполнить следующую команду в rsync НА СТАРОМ СЕРВЕРЕ (откуда все будет копироваться):

rsync -avr -e ssh —progress /vps/var/www/ root@11.22.33.44:/var/www/html

/vps/var/www/ – Это папка сервера ОТКУДА все будет копироваться (на нем и выполняется эта команда для rsync)
root@11.22.33.44:/var/www/html – root — имя пользователя для доступа на сервер КУДА копировать файлы11.22.33.44 – IP адрес сервера КУДА копировать

:/var/www/html — папка на сервере КУДА БУДЕМ копировать –> КУДА копировать файлы.

После выполнения команды, необходимо будет ввести пароль от сервера НА КОТОРЫЙ копировать (11.22.33.44)

Если возникает ошибка 500, то, возможно, это связано с количеством подключений

Ошибка (24: Too many open files) говорит о превышении максимально доступного количества открытых файлов/сокетов в операционной системе.Для решения данной проблемы необходимо:

Читайте также:  Oracle auto_increment. автоматическое заполнение поля в oracle добавлением единицы

выполнить на сервере под root команду:

===========================

Итак, у нас есть Debian 5, но особых отличий в последующих командах нет для большинства unix. Доступ через SSH (программу можно скачать ниже — PuTTY), также для доступа к файлам я использую WinSCP (скачать можно ниже).

У меня было так: установленная система Debian 5 i386, на нем шли стразу: apache, nginx, lighttp все это было со стримингом h263 или flv файлов, о которых я тоже расскажу.

Также у меня есть плеер, который поддерживает h263, h264 streaming, что это такое? Это значит, что пользователь, нажимая кнопку Play, может переместиться на любой участок времени видеофайла без предварительной полной загрузки самого файла. Решил я помечтать о том, как это классно, но руки не доходили.

Один опытный системный администратор мне подсказал, что лучше сервера, чем nginx нет, он быстр, легок, занимает мало памяти. Но при всем при этом, по нему маловато документации. И привычные файлы htaccess для защиты Ваших директорий он попросту не воспринимает. Поэтому, его обычно ставят в связке с Apache + PHP + MySQL.

Но у меня vds, на котором хранятся только видеофайлы и изображения. Мне там особых сложностей не надо.После долгих скитаний по интернету, я понял, что мне не справиться самому. Смотрел видеоуроки по unix, но что-то конкретного там не было.

Для того, чтобы понять как установить nginx мне пришлось потратить много времени в попытках и в итоге у меня ничего не получалось. Написал на форуме nginx, что хочу сконфигурировать сервер, который у меня уже установлен, но ответы были не внятные, зато я нашел товарища, который мне не просто подсказал, а еще и сделал все. Я конечно ему безмерно благодарен.

Я в линуксе ничего не соображал до недавнего времени.

Оказывается там все намного проще, чем в винде, если Вам надо поставить маленький дополнительный модуль, то необходимо сначала удалить старый nginx, затем пересобирать из исходников новый вариант своего сервера, иначе никак.
В общем-то долго думать не пришлось. Человек подсказал и версию и как все это дело установить. Кстати, ВКонтактик использует именно nginx 1.2.1 (на сегодня).

Приступим:

Для начала мне необходимо было удалить старый nginx. Казалось, что надо идти в какой-то каталог и только там выполнять команды. Но, скачайте PuTTY (ниже), войдите в свой vds, желательно под ROOT и своим паролем. Выполним для удаления nginx команду:

apt-get purge nginx

После чего все его файлы исчезли и теперь необходимо будет ставить версию с h263, h264 streaming'ом.

Для того, чтобы возрадоваться и получить полную установку, без каких-либо ошибок, используйте эти файлы:

Скачайте также программу WinSCP (ниже ссылка), если Вы сидите под виндой (я надеюсь), то также само войдите в свой vds под root и паролем. Зайдите в каталог /tmp/ и скопируйте содержимое архива туда, именно папки nginx1.5.8 и nginx_mod_h264_streaming-2.2.7

После того, как данные каталоги будут на месте, используйте PuTTY:

если у Вас не установлен сборщик и компилятор (как это бывает на свежих серверах, то установит его)

apt-get install make gcc

Далее идем:

cd /tmp/nginx1.5.8

Вы окажитесь в каталоге, в котором лежит сам сервер. Для того, чтобы подключить модуль стриминга h264 Вам необходимо будет добавить условие. Также нужно будет добавить еще одно условие для сборки сервера вместе с h263 или flv streaming'ом.
В общем-то сам код команды, который Вы выполните в вышеуказанном каталоге ( /tmp/nginx-1.2.1 ):

./configure —add-module=/tmp/nginx_mod_h264_streaming-2.2.7 —sbin-path=/usr/local/sbin2 —with-debug —with-http_flv_module

Разберем по сегментам:

./configure — выполняем дополнительную настройку—add-module=/tmp/nginx_mod_h264_streaming-2.2.7 — добавляем, собственно, модуль стриминга h264—sbin-path=/usr/local/sbin2 — указываем путь КУДА ставить сам сервер. его можно изменить на /etc/nginx—with-debug — не важно, но я так поинмаю, что это отладка или добавление настроек

—with-http_flv_module — с h263 или flv стримингом

Внимание! Если у Вас свежий сервер, и возникает ошибка:

-bash: ./configure: Permission denied

, то поставьте сборщик (команда apt-get install make gcc)

ИЛИ установить права на файл configue в папке с nginx — 777

Внимание! Если возникает ошибка связанная с PCRE library, то установите её:

apt-get install libpcre3 libpcre3-dev

Если возникает ошибка:

./configure: error: the HTTP gzip module requires the zlib library.You can either disable the module by using —without-http_gzip_moduleoption, or install the zlib library into the system, or build the zlib library

statically from the source with nginx by using —with-zlib= option.

То используйте команду для установки БЕЗ —without-http_gzip_module:

./configure —add-module=/tmp/nginx_mod_h264_streaming-2.2.7 —sbin-path=/usr/local/sbin2 —with-debug —with-http_flv_module —without-http_gzip_module

Внимание! Если возникает ошибка:

make[1]: *** [objs/addon/src/ngx_http_h264_streaming_module.o] Error 1make[1]: Leaving directory `/tmp/nginx-1.2.1'

make: *** [build] Error 2

То надо найти и убрать строку в файле ngx_http_streaming_module.c (если Вы ставите не мой дистрибутив):

if (r->zero_in_uri){return NGX_DECLINED;

}

то есть. Откройте его у себя (если ставите не с моих исходников) и впишите эту строку вконец кода, сохраните, сделайте резервную копию оригинального файла с сервера, после чего перезалейте его на сервер.
Если Вы использовали мои файлы, то там уже дописана эта строка. Значит, у Вас получилось поставить все правильно и теперь все работает.

Если ошибка: -bash: ./configure: Permission denied
то проверьте права на ВСЕ файлы chown 755 должны быть!

Если Вы не можете запустить сервер, то нужно поместить файл nginx в папку /etc/init.d, который расположен в архиве!

Важно! Файл nginx имеет директиву:

DAEMON=/usr/local/sbin/nginx

ИЛИ же ей нужно присвоить

DAEMON=/usr/local/nginx/nginx

разные версии nginx реагируют на эту строку по-разному.

Будьте добры, поставьте на /etc/init.d/nginx права 755

После того, как Вы получите много строчек кода при выполнении команды

./configure —add-module=/tmp/nginx_mod_h264_streaming-2.2.7 —sbin-path=/usr/local/sbin2 —with-debug —with-http_flv_module

, необходимо ввести следующую команду:

make && make install

После чего сервер будет НЕ запущен, а только установлен!

Для запуска сервера еще необходимо в директорию:

/usr/local/nginx/conf

скопировать файл из архива usemind.org_nginx+h264streaming.zipusrlocal
ginxconfnginx.conf

далее необходимо скопировать файл usemind.org_nginx+h264streaming.zipetcinit.d
ginx в директорию:

/etc/init.d

nginx.conf — беда не приходит одна

Все было бы не так интересно, согласитесь, если бы мы сразу добивались успеха во всем, сразу все получалось и мы не нервничали, не тратили драгоценное время…
С этим файлом не также пришлось помучатся, я же — новичок.

Выкладываю Вам свой файл с параметрами конфигурации, основные из которых мы рассмотрим (сам файл скачаете ниже). После установки, он должен находится к каталоге /usr/local/nginx/conf
Скачайте его себе на комп. и редактируйте обычным текстовым редактором.

Главными директивами в нем являются данные с 34 строки и ниже:

server {listen 80;server_name f.usemind.org www.f.usemind.org;

root /www/f.usemind.org;

#charset koi8-r;location ~ .mp4$ {mp4;}location ~ .flv$ {flv;

}

access-control-allow-origin nginx | Access to Font at '.' from origin '' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '' is therefore not allowed access

Добавьте в конфигурационный файл nginx.conf

location ~ .(eot|ttf|otf|woff|woff2)$ { add_header Access-Control-Allow-Origin *;

}

после …http {…сюда добавить. Если будет ошибка запуска nginx, то передвиньте код ниже в конфигурационном файле.

Выполнить перезагрузку веб-сервиса NginX можно командой /etc/init.d/nginx restart
Также NginX можно перезагружать принудительно с помощью 2-ух команд:

killall nginx -9
/etc/init.d/nginx start

SERVER — основной параметр конфигурации.

Прослушиваете 80 порт, указываете имя сервера, после  server_name пишите доменное имя Вашего сайта или IP адрес, ROOT — путь к папке, в которой хранятся файлы, которые необходимо открыть в общий доступ.

В нашем случае — это видеоданные. То, что написано после слова LOCATION — ~ .mp4$ { …  — это как раз таки и есть расширение файлов, которые необходимо слушать для стриминга.

PuTTY — небольшая программа, позволяющая удаленно управлять серверами, выполняя команды через неё. Утилита имеет широкий спектр настроек, имеет возможность подключаться через SSH, Telnet, Raw, Rlogin, Serial. Умеет запоминать настройки и все команды. Лицо программы настраивается пользователем. Скачать можете чуть ниже.

WinSCP — программа, позволяющая получить доступ к каталогам и файлам удаленного компьютера. Подключение может происходить по протоколам: SFTP, SCP, FTP.

Используется для быстрого и удобного доступа к файлам серверов, удаления, замены, вырезания и копирования различных файлов.

Имеет приятное, легко настраиваемое лицо, возможность поиска файла по маске на удаленном компьютере. Скачать можете чуть ниже.

Источник: https://UseMind.org/257-nastrojka-i-ustanovka-servera-dlya-video

«Нет времени объяснять!» или Как реализовать трансляцию с IP камеры на сайт?

Пожалуй мне везет на идиотские задачи в самый неподходящий момент. Это что, карма такая?! Ну да ладно..

В данном «отпускном» посте речь пойдет о том, как при наличии 3g модема и ноутбука реализовать трансляцию с IP камеры на сайт.

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

Что мы имеем?

  1. Недешевая IP камера AXIS Q1755, которую я даже в руках не держал.. Сама камера находится в городе «А» и подключена через тормозной 3g модем.
  2. Сервер на Debian 7, который крутится на почти дохлом Core2Duo. Хотя не такой уж он и дохлый, но для данных задач подходит не очень. Ах, да, сам сервер живет в городе Б.
  3. Сайт, на который необходимо повесить плеер. Сайт находится на другом, более производительном сервере, в том же городе Б.
  4. Я, который находится в городе В, с ноутбуком, 3g модемом и ограниченным трафиком в 4gb..

При помощи чего мы все это реализуем? Сама камера будет передавать поток по RTSP, FFmpeg будет принимать его и конвертировать его в RTMP, а при помощи JW Player этот поток можно «повесить на сайт».

Для тех, кто любит наглядно — получайте:

Ну а теперь главное, что же нужно сделать, чтобы заиметь у себя такую штуку?

Подготовка

Для начала нам необходимо все подготовить и установить необходимые пакеты. Например для сборки Nginx понадобится Perl библиотека регулярных выражений и заголовки OpenSSL:

apt-get install libpcre3 libpcre3-dev libssl-dev

Так же поставим утилиту rtmpdump, которая позволит нам понять, работает ли у нас rtmp или нет:

apt-get install rtmpdump

Далее скачаем сами исходники Nginx, стабильной версии 1.6.0 и распакуем их:

wget http://nginx.org/download/nginx-1.6.0.tar.gz tar -xzvf nginx-1.6.0.tar.gz

Тоже самое сделаем и с модулем, с которым нам нужно будет скомпилировать Nginx:

wget https://github.com/arut/nginx-rtmp-module/zipball/master -O nginx-rtmp-module-master.zip unzip nginx-rtmp-module-master.zip -d nginx-rtmp-module-master

Сборка Nginx с поддержкой rtmp

Теперь приступим к сборке. Для начала нужно сконфигурировать Nginx:

cd nginx-1.6.0 ./configure —prefix=/usr —add-module=../nginx-rtmp-module-master/arut-nginx-rtmp-module-0bb2323/ —pid-path=/var/run/nginx.pid —conf-path=/etc/nginx/nginx.conf —error-log-path=/var/log/nginx/error.log —http-log-path=/var/log/nginx/access.log —with-http_ssl_module

На выходи мы должны получить что-то подобное:

… configuring additional modules adding module in ../nginx-rtmp-module-master/arut-nginx-rtmp-module-0bb2323/ + ngx_rtmp_module was configured checking for PCRE library … found checking for PCRE JIT support … found checking for OpenSSL library … found checking for zlib library … found creating objs/Makefile Configuration summary + using system PCRE library + using system OpenSSL library + md5: using OpenSSL library + sha1: using OpenSSL library + using system zlib library nginx path prefix: «/usr» nginx binary file: «/usr/sbin/nginx» nginx configuration prefix: «/etc/nginx» nginx configuration file: «/etc/nginx/nginx.conf» nginx pid file: «/var/run/nginx.pid» nginx error log file: «/var/log/nginx/error.log» nginx http access log file: «/var/log/nginx/access.log» nginx http client request body temporary files: «client_body_temp» nginx http proxy temporary files: «proxy_temp» nginx http fastcgi temporary files: «fastcgi_temp» nginx http uwsgi temporary files: «uwsgi_temp» nginx http scgi temporary files: «scgi_temp»

Читайте также:  Изменение статуса узла в zabbix с помощью api. пример скрипта на php для zabbix api на включения или отключения узлов

Важно, чтобы сам rtmp модуль подключился и пути к логам, конфигам и бинарнику были верными. Выше я выделил то, что нужно проверить. Если все хорошо, то компилируем и устанавливаем:

make make install

Теперь скопируем файл stat.xsl из папки с исходниками в папку nginx:

cp nginx-rtmp-module-master/arut-nginx-rtmp-module-0bb2323/stat.xsl /etc/nginx/

И проверим работу самого nginx.

service nginx start

Заходим на http://ip_servera. Видим приветствие Nginx? Тогда все хорошо.

Установка FFmpeg и проверка его работы

Для того, чтобы мы смогли конвертировать поток rtsp в fvl, нам понадобится ffmpeg.

Да, кстати, если вы проделывайте все эти действия на Ubuntu, то имейте в виду, что в этом Ubuntu FFmpeg считается устаревшим, и в замен предлагает использовать avconv. Не пугайтесь, замена «шила на мыло» ничего не сломает, все будет работать.

Ладно, подключаем репозитории FFmpeg и ставим его:

apt-add-repository ppa:jon-severinsson/ffmpeg apt-get update apt-get install ffmpeg

Теперь проверим, на сколько удачно подключается ffmpeg к камерам. Я например забыл открыть доступ на маршрутизаторе к 554 порту.

ffmpeg -i rtsp://admin:[email protected]/axis-media/media.amp

На выходе мы должны будем получить что-то подобное:

Источник: http://maxidrom.net/archives/820

Сервер онлайн-вещаний на базе nginx

Привет всем! Несколько месяцев назад на Хабре была опубликована статья «Вещание онлайн-видео с помощью nginx» , в которой Aecktann рассказал о своем опыте внедрения разрабатываемого мной модуля к nginx для вещания видео — nginx-rtmp-module. С тех пор продукт активно развивался и в этой статье я более подробно расскажу о нем.

Вещатель нужен для передачи видео-потока клиенту. Речь идет либо о живом потоке, либо о вещании записанного видео (VOD, Video-on-demand). Существует большое количество технологий вещания видео.

Среди них можно выделить традиционные протоколы, такие как RTMP или MPEG-TS, а также появившиеся в последнее время технологии адаптивного вещания поверх HTTP. К последним относятся HLS (Apple), HDS (Adobe), Smooth Streaming (Microsoft), MPEG-DASH. При выборе технологии основным фактором является ее поддержка на клиентской стороне.

Именно поэтому вещание в формате RTMP на текущий момент является одним из самых распространенных. Протокол HLS поддерживается устройствами компании Apple, а также некоторыми версиями Android.

Для добавления модуля nginx-rtmp к nginx нужно указать его в опции —add-module при конфигурации nginx, как и любой другой модуль../configure —add-module=/path/to/nginx-rtmp-module

После сборки и инсталляции нужно добавить секцию rtmp{} в файл конфигурации nginx.conf. Добавлять ее надо в корень конфига. Например:rtmp { server { listen 1935; application myapp { live on; } }
}

Для многих случаев этой простой конфигурации будет достаточно. В ней задается RTMP-приложение с именем myapp. В это приложение мы позже будем публиковать потоки и проигрывать их из него. У каждого потока также будет свое уникальное имя. Стоит отметить один важный нюанс, касающийся приведенной выше конфигурации. Она верна для того случая, когда число воркеров nginx равно единице (как правило, задается в начале nginx.conf).worker_processes 1;

Чтобы иметь возможность использовать live вещания с бОльшим числом воркеров, нужно указать директиву rtmp_auto_push on (см. раздел «Воркеры и локальная ретрансляция»).
Для публикации и проигрывания видео можно использовать Flash-проигрыватели (JWPlayer, FlowPlayer, Strobe и т.д.). Однако, для вещания серверных потоков и для тестирования часто используют ffmpeg (и ffplay). Начнем вещание тестового файла test.mp4 следующей командой:ffmpeg -re -i /var/videos/test.mp4 -c copy -f flv rtmp://localhost/myapp/mystream

Тут надо учесть, что RTMP поддерживает ограниченый набор кодеков, впрочем, такие популярные кодеки, как H264 и AAC, входят в их число. Если кодеки в тестовом файле не совместимы с RTMP, потребуется перекодировка:ffmpeg -re -i /var/videos/test.mp4 -c:v libx264 -c:a libfaac -ar 44100 -ac 2 -f flv rtmp://localhost/myapp/mystream

Вещать можно как поток из файла, так и из другого источника. Например, если предположить, что по адресу video.example.com/livechannel.ts вещается некий live MPEG-TS поток, то его также можно завернуть в rtmp:ffmpeg -i http://video.example.com/livechannel.ts -c copy -f flv rtmp://localhost/myapp/mystream

Пример вещания с локальной веб-камеры:ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an -f flv rtmp://localhost/myapp/mystream

Проиграть поток можно при помощи ffplay следующей командой:ffplay rtmp://localhost/myapp/mystream

И, наконец, простой пример использования JWPlayer для проигрывания потока из браузера (полностью приведен в директории /test/www модуля):
Loading the player … jwplayer(«container»).setup({ modes: [ { type: «flash», src: «/jwplayer/player.swf», config: { bufferlength: 1, file: «mystream», streamer: «rtmp://localhost/myapp», provider: «rtmp», } } ]
});

Модуль поддерживает вещание видео-файлов в форматах mp4 и flv. Пример настройки:application vod { play /var/videos;
}

При проигрывании, соответственно, надо указывать имена файлов, в остальном все аналогично живому вещанию.ffplay rtmp://localhost/vod/movie1.mp4
ffplay rtmp://localhost/vod/movie2.flv

При построении распределенных систем важно иметь возможность ретрансляции потоков для балансировки нагрузки
по большому числу серверов. Модуль реализует два типа ретрансляции: push и pull. Первый тип ретрансляции
состоит в передаче на удаленный сервер локально публикуемого потока, а второй — в передаче удаленного
потока на локальный сервер. Пример push ретрансляции:application myapp { live on; push rtmp://cdn.example.com;
}

В момент, когда начинается публикация по адресу rtmp://localhost/myapp/mystream, создается соединение с удаленным сервером и поток mystream публикуется далее на rtmp://cdn.example.com/myapp/mystream. При прекращении локальной публикации, соединение с cdn.example.com автоматически завершается.

Pull-ретрансляции выполняют обратную операцию:

application myapp { live on; pull rtmp://cdn.example.com;
}

В этом примере при появлении клиента, желающего локально проиграть поток rtmp://localhost/myapp/mystream, будет создано соединение с rtmp://cdn.example.com/myapp/mytstream и удаленный поток будет ретранслирован на локальный сервер, после чего станет доступным всем локальным клиентам. В тот момент, когда не останется ни одного клиента, соединение будет завершено.
Для вещания на устройста iPhone/iPad, а также на новые версии Android, используется протокол HLS (HTTP Live Streaming).
Протокол был разработан компанией Apple и представляет из себя «нарезанный» на куски MPEG-TS/H264/AAC поток, отдаваемый по HTTP. К потоку прилагается плейлист в формате m3u8. Отдавать HTTP nginx умеет отлично. Значит, надо лишь создать и обновлять плейлист и фрагменты HLS-потока, а также следить за удалением старых фрагментов. Для этого существует модуль nginx-rtmp-hls. Он находится в директории hls, однако не собирается по умолчанию т.к. требует библиотеки libavformat, входящей в пакет ffmpeg. Для сборки nginx с поддержкой HLS, надо добавить этот модуль явно при конфигурации:./configure —add-module=/path/to/nginx-rtmp-module —add-module=/path/to/nginx-rtmp-module/hls

Так вышло, что некоторое время назад проект ffmpeg был форкнут. И теперь у нас есть два проекта — ffmpeg и avconv, а следовательно, тут же начали возникать проблемы совместимости (вернее, несовместимости) библиотек. Для сборки nginx-rtmp нужен оригинальный ffmpeg. В то же время, некоторые дистрибутивы Linux перешли на использование avconv, который для сборки не подойдет. На этот случай я написал подробную инструкцию.

Для генерации HLS достаточно указать следующие директивы:

application myapp { live on; hls on; hls_path /tmp/hls; hls_fragment 5s;
}

Ну и, наконец, в секции http{}, настроить отдачу всего, что связано с HLS:location /hls { root /tmp;
}

Теперь публикуем поток mystream в приложение myapp, а в браузере iPhone набираем в строке адресаexample.com/hls/mystream.m3u8. Кроме того, поток можно встроить в html тег video:

Отмечу, что для проигрывания на iPhone поток должен быть закодирован в H264 и AAC. Если исходный поток не соответствует этим условиям, необходимо настроить перекодирование.
При вещании видео часто возникает необходимость перекодирования входящего потока в другое качество, либо другие кодеки. Эта задача по своей сути кардинально отличается от раздачи RTMP и, в отличие от последней, связана с высокими нагрузками на CPU, большим и активным потреблением памяти, часто опирается на использование многопоточности и является потенциально нестабильной. По этой причине она не должна включаться в основной процесс сервера, и в идеале должна выполняться отдельным процессом. Стоит отметить, что прекрасный инструмент для решения этой задачи уже существует — это все тот же ffmpeg. Он поддерживает огромное число кодеков, форматов и фильтров, позволяет использовать множество сторонних библиотек. Вместе с тем, он достаточно прост и активно поддерживается сообществом. Модуль nginx-rtmp предоставляет простой интерфейс для использования ffmpeg. Директива exec позволяет запустить внешнее приложение в момент публикации входящего потока. При завершении публикации приложение также принудительно завершается. Кроме того, поддерживается перезапуск запущенного приложения, если оно внезапно завершилось само.application myapp { live on; exec ffmpeg -i rtmp://localhost/myapp/$name -c:v flv -c:a -s 32×32 -f flv rtmp://localhost/myapp32x32/$name;
} application myapp32x32 { live on;
}

В этом примере ffmpeg используется для перекодирования входящего видео в Sorenson-H263, изменении его размера до 32х32 и публикации результата в приложение myapp32x32. Можно одновременно задать несколько директив exec, которые будут производить с потоком любые преобразования и публиковать результат в другие приложения как на локальный, так и на удаленный сервер. Директива поддерживает несколько переменных, среди которых $app (имя приложения) и $name (имя потока).
Как известно, nginx является однопоточным сервером. Для того, чтобы эффективно использовать все ядра современных процессоров, обычно он запускается в несколько воркеров. Обработка HTTP запросов как правило, происходит независимо друг от друга, и лишь в отдельных случаях (как, например, в случае с кешом), требуется осуществлять доступ к общим данным. Такие данные хранятся в разделяемой памяти.

При живом вещании ситуация иная. Все клиентские соединения, проигрывающие поток, очевидным образом зависят от соединения, публикующего этот поток.

Использование разделяемой памяти в данном случае неэффективно, излишне трудоемко, привело бы к синхронизации и большой потере производительности. Поэтому для использования нескольких воркеров был реализован механизм внутренних ретрансляций через UNIX-сокеты.

Собственно, такие ретрансляции практически ничем не отличаются от обычных внешних push-ретрансляций. Локальные ретрансляции включаются следующей директивой

rtmp_auto_push on;

Указывать ее надо в корневой секции конфигурационного файла. Отмечу, что локальные ретрансляции нужны только для живых вещаний.
Часто возникает необходимость записи на диск публикуемых потоков. Модуль позволяет записывать как отдельные данные из потока (аудио, видео, ключевые фреймы) так и поток целиком. Можно установить ограничение на размер файла, а также на число записываемых фреймов. Следующий пример включает запись первых 128К каждого потока.record all;
record_path /tmp/rec;
record_max_size 128K;

Запись происходит в формате flv в директорию /tmp/rec.

Управлять записью можно в ручном режиме, включая и отключая ее при помощи http-запроса. Для этого используется control-модуль. Информацию о нем можно найти на сайте проекта.

Читайте также:  Dkim + postfix. настройка dkim + postfix для freebsd, ubuntu и centos. защита почты с помощью dkim

Во многих случаях требуется ввести ограничения или учет операций публикации и проигрывания видео. Это бывает связано с логикой проекта, в котором он используется. Самый частый подобный случай — необходимость авторизации пользователя перед тем, как дать ему доступ к просмотру видео. Чтобы интегрировать бизнес-логику проекта в вещатель, в модуле реализованы HTTP-колбэки, такие как on_publish и on_play. Серверный код получает всю имеющуюся информацию о клиенте, включая его адрес, имя потока, адрес страницы и т.д. Если возвращается HTTP статус 2xx, то колбек считается завершенным успешно и работа клиента продолжается. В противном случае соединение разрывается.on_publish http://example.com/check_publisher;
on_play http://example.com/check_player;

В каждый момент времени к вашему серверу могут быть подсоединены тысячи клиентов. Естественно, нужен интерфейс, позвляющий увидеть их список, а также все основные характеристики публикуемых или проигрываемых ими потоков. Причем, важно, чтобы эту информацию можно быть как анализировать визуально, так и обрабатывать программно. Такой интерфейс у модуля nginx-rtmp существует. Чтобы его использовать, необходимо в http-секции nginx.conf прописать следующие директивы.location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl;
} location /stat.xsl { root /path/to/stat.xsl/dir/;
}

Директива rtmp_stat включает отдачу XML-документа с полным описанием live-клиентов, публикующих или проигрывающих потоки, списком приложений и серверов. Этот документ удобен для программной обработки, но для визуального анализа совершенно не годится. Чтобы иметь возможность просматривать список клиентов в браузере, директивой rtmp_stat_stylesheet задается относительный путь к таблице стилей XML (stat.xsl). Этот файл лежит в корне проекта. Надо настроить nginx на его раздачу по указанному урлу. Результат можно просматривать в браузере.

Существует возможность явно разрывать клиентские соединения. Для этого используется control-модуль, не описанный в статье.

С самого начала статьи я постоянно употреблял слово «видео». Конечно, модуль может вещать не только видео, а также и аудио-потоки. Вот простой пример интернет-радиостанции на bash, вещающей mp3-файлы из /var/music. Этот поток может воспроизводить простой JWPlayer, встроенный в веб-страницу.while true; do ffmpeg -re -i «`find /var/music -type f -name '*.mp3'|sort -R|head -n 1`» -vn -c:a libfaac -ar 44100 -ac 2 -f flv rtmp://localhost/myapp/mystream;
done

Модуль совместим со всем основным софтом, работающим с протоколом RTMP, включая FMS/FMLE, Wowza, Wirecast, протестирован с самыми распространенными флеш-проигрывателями JWPlayer, FlowPlayer, StrobeMediaPlayback, а также отлично работает с ffmpeg/avconv и rtmpdump.
Модуль использует асинхронную однопоточную модель сервера nginx. Это позволяет добиться высокой производительности. Мы используем модуль на машинах Intel Xeon E5320/E5645 в режиме одного воркера. В этом режиме удается достигнуть максимальной пропускной способности имеющихся сетевых карт — 2Gbps. Пользователи модуля подтверждают сохранение этого же соотношения (2Gbps на ядро) в режиме локальной ретрансляции с несколькими воркерами. Практика показывает, что производительность вещателя обычно упирается в сеть, а не в CPU.

Прямых сравнений с другими продуктами я не проводил, однако, «тяжелые» многопоточные FMS, Wowza и Red5, будучи более функциональными, должны, в силу особенностей реализации, существенно проигрывать моему решению по числу одновременно подсоединенных клиентов и нагрузке на CPU. Это подтверждается многими пользователями, проводившими такие сравнения, в т.ч. в уже упомянутой мной статье.

В заключение скажу, что модуль распространяется по лицензии BSD. Он собирается и работает под Linux, FreeBSD и MacOS. В статье описана лишь малая часть функционала nginx-rtmp-module. Желающие могут ознакомиться с проектом по ссылкам, приведенным ниже.
Буду рад, если читателям Хабра проект покажется интересным.

Всем спасибо!

Источник: http://www.liverec.com/2013/01/nginx.html

nginx + ffmpeg = rtmp. Потоковое видео на сайт

Думаю, что среди всего многообразия статей (например, тут и её дубль на хабре), авторы всё-же опускают некоторые важные моменты для первооткрывателей. Об этих моментах надо додумывать самому, догадываться, либо экспериментировать.

Итак, есть видеопотоки в локальной сети, например от камер, по схеме: rtsp->udp->http(astra ext.). Задача — встроить flash-плеер на сайт и кормить ему rtmp. При этом желательно поток «ужать» до 0.5-1 Мбит, потому как IP-камеры вещают в HD, а это как минимум 5 Мбит.

Моя заметка как я делал…
Для начала необходимые пакеты:

apt-get install libpcre3 libpcre3-dev libssl-dev gcc build-essential unzip rtmpdump

Устанавливать nginx надо не через apt-get, а из исходников.

wget http://conture.by/wp-content/uploads/2015/06/nginx-1.8.0.tar.gz tar -xzvf nginx-1.8.0.tar.gz wget http://conture.by/wp-content/uploads/2015/06/nginx-rtmp-module-master.zip unzip nginx-rtmp-module-master.zip -d nginx-rtmp-module-master wget http://conture.by/wp-content/uploads/2015/06/ffmpeg_nginx.zip unzip ffmpeg_nginx.zip -d /bin chmod 777 /bin/ffmpeg_nginx cd nginx-1.8.0 ./configure —prefix=/usr —add-module=../nginx-rtmp-module-master/arut-nginx-rtmp-module-f62a083/ —pid-path=/var/run/nginx.pid —conf-path=/etc/nginx/nginx.conf —error-log-path=/var/log/nginx/error.log —http-log-path=/var/log/nginx/access.log —with-http_ssl_module make make install cp ../nginx-rtmp-module-master/arut-nginx-rtmp-module-f62a083/stat.xsl /etc/nginx/stat.xsl

Далее открываем конфиг nginx расположенный /etc/nginx/nginx.conf и правим под себя. У меня он следующий…

user www-data; worker_processes 4; # воркеры по количеству ядер процессора pid /run/nginx.pid; error_log /var/log/nginx/nginx_error.log debug; env PATH; events { worker_connections 768; } http { access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 88; # 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 /etc/nginx/; } location / { rtmp_control all; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } # RTMP proxy rtmp { access_log /var/log/nginx/rtmp_access.log; server { listen 1935; ping 30s; notify_method get; # ретрансляция без звука application camera_1 { live on; exec_pull ffmpeg_nginx -i http://192.168.2.40:8000/71-camera1 -vcodec copy -f flv -an rtmp://localhost:1935/camera_1/live 2>>/var/log/nginx/ffmpeg_camera_1.log; } # конвертируем в меньшее разрешение без звука application cam_1 { live on; exec_pull ffmpeg_nginx -i http://192.168.2.40:8000/71-camera1 -threads 2 -f flv -r 25 -s 800×600 -an rtmp://localhost:1935/cam_1/live 2>>/var/log/nginx/ffmpeg_cam1.log; } # и ещё один поток… application infochan { live on; exec_pull ffmpeg_nginx -i http://192.168.2.40:8000/70-infokanal -threads 2 -f flv -r 25 -s 800×600 -an rtmp://localhost:1935/infochan/live 2>>/var/log/nginx/ffmpeg_infochan.log; } } }

Проверяем корректность нашего конфига nginx:

root@kubuntu:~# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful root@kubuntu:~#

Если всё ок, то запускаем nginx:

service nginx start

Проверяем льётся ли что-нибудь на порт 1935. Выхлоп должен идти прямо в консоль.

rtmpdump -r «rtmp://127.0.0.1:1935/camera_1/live» -v rtmpdump -r «rtmp://127.0.0.1:1935/cam_1/live» -v rtmpdump -r «rtmp://127.0.0.1:1935/infochan/live» -v

Если есть выхлоп, то гуд. Приступаем к установке Flash-плеера на сайт. Качаем и распаковываем папку архива на сайт.
Содержимое html-страницы где будет встроен плеер должно иметь следующую структуру:

Loading the player …

Ну и как это работает. Поток от INETCOM (Москва), Рязанский проспект…

Запись опубликована в рубрике Linux с метками flash, nginx, rtmp, video. Добавьте в закладки постоянную ссылку.

Источник: http://conture.by/post/1552

Setting up HLS live streaming server using NGINX + nginx-rtmp-module on Ubuntu¶

This guide will explain how to setup your own streaming server on ubuntu.

1. Compile nginx with rtmp module¶

Firstly, we'll need to compile nginx with the nginx-rtmp-module.

We recommend using this forked module. It's being actively worked on and contains more fixes and improvements over the original one

Clone nginx-rtmp-module

git clone https://github.com/sergey-dryabzhinsky/nginx-rtmp-module.git

Install nginx dependencies

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

Download nginx
Latest nginx can be downloaded from this page.
for example nginx-1.10.1 can be downloaded from this link: http://nginx.org/download/nginx-1.10.1.tar.gz

wget http://nginx.org/download/nginx-1.10.1.tar.gz
tar -xf nginx-1.10.1.tar.gz
cd nginx-1.10.1

Compile nginx

./configure —with-http_ssl_module —add-module=../nginx-rtmp-module
make -j 1
sudo make install
  • Notice the —add-module=../nginx-rtmp-module argument, the path must point correctly to the cloned module
  • (Optional) replace -j 1 with the amount of cpu's on your computer to accelerate the compilation

2. Create nginx configuration file¶

rtmp module config

An application in nginx means an rtmp endpoint
Basic uri syntax: rtmp://nginx_host[:nginx_port]/app_name/stream_name
We will be using stream as our stream name so our endpoint will be: rtmp://localhost/show/stream Which will later be available as http://localhost:8080/hls/stream.m3u8

For good HLS experience we recommend using 3 seconds fragments with 60 seconds playlist.

1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
rtmp { server { listen 1935; # Listen on standard RTMP port chunk_size 4000; application show { live on; # Turn on HLS hls on; hls_path /mnt/hls/; hls_fragment 3; hls_playlist_length 60; # disable consuming the stream from nginx as rtmp deny play all; } }
}

Note that the example points /mnt/hls/ as the target path for the hls playlist and video files.
You can change this to a different directory but make sure that nginx have write permissions.

http server config

Since HLS consists of static files, a simple http server can be set up with two additions, correct MIME types and CORS headers.

1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server { listen 8080; location /hls { # Disable cache add_header Cache-Control no-cache; # CORS setup add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Expose-Headers' 'Content-Length'; # allow CORS preflight requests if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /mnt/; }
}

the complete nginx.conf

The default location for nginx conf is /usr/local/nginx/conf/nginx.conf or /etc/nginx/nginx.conf

1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
worker_processes auto;
events { worker_connections 1024;
} # RTMP configuration
rtmp { server { listen 1935; # Listen on standard RTMP port chunk_size 4000; application show { live on; # Turn on HLS hls on; hls_path /mnt/hls/; hls_fragment 3; hls_playlist_length 60; # disable consuming the stream from nginx as rtmp deny play all; } }
} http { sendfile off; tcp_nopush on; aio on; directio 512; default_type application/octet-stream; server { listen 8080; location / { # Disable cache add_header 'Cache-Control' 'no-cache'; # CORS setup add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Expose-Headers' 'Content-Length'; # allow CORS preflight requests if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } types { application/dash+xml mpd; application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /mnt/; } }
}

3. Start nginx¶

The nginx binary is located wherever you compiled it to — /usr/local/nginx/sbin/nginx by default. Change it to reflect your path.

Test the configuration file

/usr/local/nginx/sbin/nginx -t

Start nginx in the background

/usr/local/nginx/sbin/nginx

Start nginx in the foreground

/usr/local/nginx/sbin/nginx -g 'daemon off;'

Reload the config on the go

/usr/local/nginx/sbin/nginx -t && nginx -s reload

Kill nginx

/usr/local/nginx/sbin/nginx -s stop

4. Pushing live stream to nginx using rtmp¶

nginx accepts rtmp stream as input. For a proper HLS stream the video codec should be x264 and audio codec aac/mp3/ac3 most commonly being aac.

Options 1: From existing rtmp stream already in h264¶

Источник: https://docs.peer5.com/guides/setting-up-hls-live-streaming-server-using-nginx/

Ссылка на основную публикацию