Настройте Nginx в Ubuntu для потоковой передачи живого видео HLS

HTTP Live Streaming (HLS) - это очень надежный протокол потокового видео, реализованный Apple Inc. HLS использует транзакции HTTP, которые пересекают межсетевые экраны, прокси-серверы и могут легко распространяться через CDN. Следовательно, эта технология способна охватить гораздо большую аудиторию просмотра, чем RTP или другие протоколы на основе UDP. Сегодня большая часть потокового видео онлайн размещается в дорогих системах, использующих HLS, но, как правило, они дорогие и требуют много серверных ресурсов. Из этого туториала Вы узнаете, как настроить очень доступный Ubuntu 14.04 VULTR VPS для потоковой передачи событий HLS с использованием только программного обеспечения с открытым исходным кодом.

Первым шагом является чтение и настройка вашего сервера в соответствии с документом Vultr « Настройка Nginx-RTMP в Ubuntu 14.04 ». Инструкции в этом документе были наиболее полными для этапа установки на момент написания. Я хотел бы отметить, что вы можете заменить «nginx-1.7.5» на «nginx-1.9.4» или любую другую доступную последнюю версию Nginx. Другое предложение состоит в том, чтобы скомпилировать Nginx с модулем состояния HTTP-заглушки, чтобы дать себе возможность отслеживать, сколько у вас в будущем живых зрителей HLS.

Вместо компиляции с:

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

Используйте эту строку в процедуре, описанной в предварительном документе:

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

Пример в этом руководстве создаст как «живой», так и «мобильный» (оптимизированный) потоки и будет использовать ffmpeg (установленный в предыдущем руководстве) для генерации потока HLS с оптимизированной скоростью передачи, оптимизированного для мобильных устройств. В этом примере также будет показано, как заставить сервер автоматически записывать ваши прямые трансляции и позволить воспроизводить записи в качестве службы воспроизведения видео по запросу (VOD).

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

sudo mkdir /HLS
sudo mkdir /HLS/live
sudo mkdir /HLS/mobile
sudo mkdir /video_recordings
sudo chmod -R 777 /video_recordings

Вероятно, хорошей идеей будет включить брандмауэр, если вы этого еще не сделали. Если это так, вы должны разрешить трафик в порты, используемые Nginx и HLS. Если вы хотите работать без брандмауэра, игнорируйте раздел ufw ниже.

sudo ufw limit ssh
sudo ufw allow 80
sudo ufw allow 1935
sudo ufw enable

Для потоковой передачи HLS требуется существенно отличная конфигурация Nginx от конфигурации RTMP в первой статье. Отредактируйте ваш nginx.confфайл так, чтобы он заменял «my-ip» и «my-stream-key» на вашу информацию. Вы можете использовать все, что вы хотели бы для "my-stream-key", это просто слово, которое является уникальным и полезным для вас. Вы можете сначала создать резервную копию вашего исходного файла конфигурации, а затем вставить мою предоставленную информацию о конфигурации в редактор, заменив все, что там было:

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

Новый nginx.conf:

worker_processes  1;
error_log  logs/error.log debug;
events {
worker_connections  1024;
}
rtmp {
server {
listen 1935;
allow play all;

#creates our "live" full-resolution HLS videostream from our incoming encoder stream and tells where to put the HLS video manifest and video fragments
application live {
allow play all;
live on;
record all;
record_path /video_recordings;
record_unique on;
hls on;
hls_nested on;
hls_path /HLS/live;
hls_fragment 10s;

#creates the downsampled or "trans-rated" mobile video stream as a 400kbps, 480x360 sized video
exec ffmpeg -i rtmp://192.168.254.178:1935/$app/$name -acodec copy -c:v libx264 -preset veryfast -profile:v baseline -vsync cfr -s 480x360 -b:v 400k maxrate 400k -bufsize 400k -threads 0 -r 30 -f flv rtmp://192.168.254.178:1935/mobile/$;
}

#creates our "mobile" lower-resolution HLS videostream from the ffmpeg-created stream and tells where to put the HLS video manifest and video fragments
application mobile {
allow play all;
live on;
hls on;
hls_nested on;
hls_path /HLS/mobile;
hls_fragment 10s;
}

#allows you to play your recordings of your live streams using a URL like "rtmp://my-ip:1935/vod/filename.flv"
application vod {
play /video_recordings;
}
}
}


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

server {
listen 80;
server_name 192.168.254.178;

#creates the http-location for our full-resolution (desktop) HLS stream - "http://my-ip/live/my-stream-key/index.m3u8"      
location /live {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/live;
add_header Cache-Control no-cache;
}

#creates the http-location for our mobile-device HLS stream - "http://my-ip/mobile/my-stream-key/index.m3u8"        
location /mobile {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/mobile;
add_header Cache-Control no-cache;
}   

#allows us to see how stats on viewers on our Nginx site using a URL like: "http://my-ip/stats"     
location /stats {
stub_status;
}

#allows us to host some webpages which can show our videos: "http://my-ip/my-page.html"     
location / {
root   html;
index  index.html index.htm;
}   
}
}

Нажмите Ctrl + X, чтобы выйти. Скажите «да», чтобы сохранить изменения.

Вы можете найти четкие инструкции и примеры возможных переменных в этом nginx.confфайле, если запросите в своей любимой поисковой системе «директивы nginx-rtmp». Я использую nginx-rtmp с HLS уже несколько лет, не используя директив «allow publish» и «deny publish», и я видел ноль случаев, когда люди использовали / вторгались в мои видеосерверы. Поэтому я не включил эти директивы здесь. Прочитайте и добавьте эти директивы, если хотите.

После изменения nginx.confфайла необходимо перезапустить Nginx, чтобы использовать новую конфигурацию:

sudo service nginx restart

Внимательно следите за сообщениями об ошибках Nginx и устраняйте любые ошибки, которые могли быть вызваны неправильным написанием, владением папками или проблемами с разрешениями. Если у вас нет сообщений об ошибках, то вы готовы создать свой кодированный поток.

Вы должны иметь видеокодер для создания потока. Я использую OBS (Open Broadcaster Software) - с открытым исходным кодом и хорошо работает для меня. Есть и другие решения на выбор, которые выходят за рамки данного руководства. Я не буду охватывать все о настройке RTMP видео кодера. Все они требуют примерно одинаковых входных переменных. Ключевые параметры, которые вам нужно будет ввести, чтобы использовать мою точную nginx.confконфигурацию и хорошо работать на большинстве плееров / браузеров / платформ:

  1. Кодер-x264
  2. Переменный битрейт (не CBR или постоянный битрейт), высочайшее качество
  3. Максимальный битрейт-600kbps
  4. Аудио-кодек-AAC
  5. Аудио-Format-44,1
  6. Аудио-битрейт-64kbps
  7. FMS URL- "rtmp: // my-ip: 1935 / live"
  8. Ключ потока - "мой-поток-ключ"
  9. Разрешение 640х480-
  10. FPS (кадров в секунду) -30
  11. CFR (постоянная частота кадров) - да
  12. Интервал ключевого кадра - 2 секунды (один ключевой кадр каждые 2 секунды)
  13. Профиль кодирования x264 - базовый уровень (может работать с основным - зависит от используемого проигрывателя)
  14. x264 CPU Present-очень быстрый

Я рекомендую пробовать разные кодеры и экспериментировать с ними. Вы можете пожелать широкого соотношения сторон или ваша камера (или другие вещательные материалы) могут потребовать этого Если это так, обязательно измените эту информацию в вашем кодере, а также соотношение сторон, указанное в разделе exec-ffmpeg nginx.confфайла, который я предоставил; в противном случае вы получите несколько глупо выглядящих видео каналов.

Как только ваш кодировщик настроен, вы можете все это протестировать. Запустите энкодер с вашей веб-камерой или каким-нибудь тестовым кормом, работающим на ней. В этот момент вы можете просматривать трансляцию с помощью VLC плеера, используя такие URL-адреса, как

http://my-ip/live/my-stream-key/index.m3u8
http://my-ip/mobile/my-stream-key/index.m3u8

Они предназначены для вашего основного и мобильного потокового видео соответственно. Подставьте свой IP и ключ потока соответственно.

После того, как вы успешно транслировали свою первую проверку потока (через ssh или ftp), ваша прямая трансляция была записана в /video_recordingsпапку на Vultr VPS. Вы также можете попробовать воспроизвести этот записанный файл в VLC с URL-адресом, например:

rtmp://my-ip/vod/filename.flv

Статистика Nginx также доступна (с Nginx stub_status). Чтобы просмотреть статистику посетителей / зрителей, откройте:

http://my-ip/stats

Для просмотра видео на веб-странице вам понадобится встраиваемый проигрыватель. Доступно много встраиваемых проигрывателей, которые будут воспроизводить видео HLS. Я использую JW Player уже несколько лет, но бесплатная версия не будет играть в HLS. Flowplayer и Bitdash от Bitmovin (среди прочих решений) достаточно щедры, чтобы бесплатно предложить некоммерческую версию своих проигрывателей, которая сделает ваш поток HLS встроенным в веб-страницу. В этой статье я попробовал их оба и обнаружил, что они хорошо работают с моим видеосервером на основе Vultr / Nginx. Я кратко покажу, как я запустил Flowplayer с моей тестовой машиной.

Если вы собираетесь использовать потоковую передачу HLS в реальном времени любым обычным, устойчивым или коммерческим способом, я рекомендую вам приобрести лицензию у Flowplayer или любого другого игрока, которого вы решите использовать. Вы получите игрока, который имеет меньше ограничений, больше функций и может быть добавлен в вашу организацию. Вы также получите поддержку - что может быть очень важно. За исключением Vultr VPS, это действительно единственная стоимость, связанная с проектом.

Прежде чем делать что-то еще, важно позаботиться о том, что называется «междоменными» ограничениями, которые иначе лишали бы вас возможности транслировать на веб-страницу / веб-сайт. Создайте crossdomain.xmlфайл в своей nginx/htmlпапке и вставьте в него инструкции, позволяющие передавать данные между доменами:

sudo nano /usr/local/nginx/html/crossdomain.xml

Сначала скопируйте (с этой страницы), а затем вставьте (щелкните правой кнопкой мыши) в поле nano editor следующие данные XML:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>

Нажмите Ctrl + O, чтобы записать, затем Ctrl + X, чтобы сохранить файл на диск и выйти.

Я взял HTML5 (версия 6.0.3) из Flowplayer, который дал мне несколько файлов и папку в разархивированном виде. Я загрузил все файлы и папку в подпапку корневой папки Nginx / HTML, которую я назвал «flowplayer». Точный путь был /usr/local/nginx/html/flowplayer.

Чтобы протестировать наше видео, встроенное в веб-страницу, создайте пару файлов HTML в корне папки Nginx / HTML с помощью nano и заполните их следующим содержимым.

Файл:

sudo nano /usr/local/nginx/html/hls.html

HTML код:

<!doctype html>
<head>
<link rel="stylesheet" href="#">
</head>

<body>
640x480 664kbps (live) Desktop Browsers<br>
<div style="width:640px;" class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src="">
</video>
</div>
<br><br>
480x360 464kbps (mobile) Mobile Browsers <br>
<div style="width:480px;" class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src="">
</video>
</div>
</body>

Файл:

sudo nano /usr/local/nginx/html/hls_progressive.html

HTML код:

<!doctype html>
<head>
<link rel="stylesheet" href="#">
<style> .flowplayer { width: 640px; } </style>
</head>

<body>
<div class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src=""> 
<source type="application/x-mpegurl" src="">
</video>
</div>
<br>
</body>

Обязательно замените «my-ip» и «my-stream-key» вашими данными.

Вы должны заменить путь flowplayer/skin/functional.cssдля знака "#" в таблице стилей href="#". Учебное программное обеспечение убирает путь. Вы должны заполнить URL-адрес в src=""части - он удаляется из учебного программного обеспечения, использования http://my-ip/live/my-stream-key/index.m3u8и http://my-ip/mobile/my-stream-key/index.m3u8, соответственно. Вы также должны добавить srcтеги сценариев в голову для обоих jquery-1.11.2.min.jsи для flowplayer.min.js. Теги удаляются учебным программным обеспечением. Вы можете узнать, как example htmlсоздать эти теги, взглянув на файл, входящий в комплект Flowplayer.

Запустите энкодер с вашей веб-камерой или каким-нибудь тестовым кормом, работающим на ней. Вы можете просмотреть свою трансляцию в браузере, используя следующие URL:

http://my-ip/hls.html
http://my-ip/hls_progressive.html

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

Вторая страница показывает один поток. Но это настроено так, что называется «прогрессивным потоком». Это означает, что когда зритель воспроизводит видео, и сервер, и проигрыватель пытаются предоставить зрителю высококачественный поток с высокой скоростью передачи битов, если соединение со зрителями может поддерживать его. Если их соединение плохое и оно не может поддерживать соединение, оно сводится к отображению потока с более низкой скоростью передачи (мобильный), который на 200 кбит / с ��иже в полосе пропускания. Если вы хотите, вы можете создавать более постепенные, прогрессивные потоки с помощью ffmpeg и настраивать их, используя мой пример.

Я протестировал эту конфигурацию на одноядерном Vultr VPS 1 ГБ и обнаружил, что с одним живым потоком и трансляционным мобильным потоком, который он создает с помощью ffmpeg, загрузка ЦП составляла менее 35% и потребляла всего 100 МБ. мой 1 ГБ оперативной памяти. Теперь это очень эффективная настройка.

Если вы планируете передавать потоковое видео, размер которого в пикселях намного больше, чем в SD, вы можете обнаружить, что вам нужно использовать более мощный VPS. Мне было любопытно по этому поводу, и я запускал свой основной поток до 1280x960 пикселей и 2 Мбит / с - создавая дополнительную нагрузку на вещи. Но VPS все еще использовал только 50% ЦП, а использование памяти оставалось на уровне 100 МБ. Я добавил дюжину зрителей / браузеров, и нагрузка на VPS практически не изменилась - увеличилась только используемая пропускная способность. Я уверен, что создание дополнительных транс-рейтинговых потоков с помощью ffmpeg продолжит создавать дополнительную нагрузку на систему.

Я использовал этот тип сервера в производственных средах с числом одновременных пользователей от 50 до 100 и обнаружил, что использование ресурсов очень мало возрастало с увеличением количества подключений зрителей. Экспериментируйте с этим. Но я думаю, что большинство пользователей были бы рады использовать одноядерный, 1GB VPS. Наслаждайтесь своим новым потоковым сервером HLS!



Leave a Comment

Как установить платформу интернет-магазина LiteCart в Ubuntu 16.04

Как установить платформу интернет-магазина LiteCart в Ubuntu 16.04

LiteCart является бесплатной платформой для покупок с открытым исходным кодом, написанной на PHP, jQuery и HTML 5. Это простой, легкий и простой в использовании софтвар для электронной коммерции.

Как установить Anchor CMS на CentOS 7 LAMP VPS

Как установить Anchor CMS на CentOS 7 LAMP VPS

Используете другую систему? Anchor CMS - это сверхпростая и чрезвычайно легкая бесплатная система управления контентом (CMS) с открытым исходным кодом.

Как установить Matomo Analytics на Fedora 28

Как установить Matomo Analytics на Fedora 28

Используете другую систему? Matomo (ранее Piwik) - это аналитическая платформа с открытым исходным кодом, открытая альтернатива Google Analytics. Источник Matomo размещен o

Настройте сервер TeamTalk в Linux

Настройте сервер TeamTalk в Linux

TeamTalk - это система конференц-связи, которая позволяет пользователям вести высококачественные аудио / видео-беседы, текстовый чат, передавать файлы и обмениваться экранами. Это я

Как установить TextPattern CMS 4.6.2 на VBS FreeBSD 11 FAMP

Как установить TextPattern CMS 4.6.2 на VBS FreeBSD 11 FAMP

Используете другую систему? TextPattern CMS 4.6.2 - это простая, гибкая, бесплатная система управления контентом (CMS) с открытым исходным кодом, которая позволяет веб-дизайнерам

Как установить форум NodeBB на FreeBSD 12

Как установить форум NodeBB на FreeBSD 12

Используете другую систему? NodeBB - это программное обеспечение для форумов на базе Node.js. Он использует веб-сокеты для мгновенного взаимодействия и уведомления в режиме реального времени. УзелБ

Как установить Backdrop CMS 1.8.0 на CentOS 7 LAMP VPS

Как установить Backdrop CMS 1.8.0 на CentOS 7 LAMP VPS

Используете другую систему? Backdrop CMS 1.8.0 - это простая и гибкая, удобная для мобильных устройств, бесплатная система с открытым исходным кодом (CMS), которая позволяет нам

Как установить Ranger Terminal File Manager в Linux

Как установить Ranger Terminal File Manager в Linux

Ranger - это файловый менеджер на основе командной строки с привязками клавиш VI. Он предоставляет минималистичный и приятный интерфейс curses с видом на иерархию каталогов.

Настройте Magento на CentOS 6

Настройте Magento на CentOS 6

Если вы хотите разместить свой инвентарь в Интернете или просто магазин технических аксессуаров, Magento - отличное решение для электронной коммерции в Интернете. Это статья

Как собрать Brotli из исходного кода на Ubuntu 18.04 LTS

Как собрать Brotli из исходного кода на Ubuntu 18.04 LTS

Используете другую систему? Brotli - это новый метод сжатия с лучшей степенью сжатия, чем GZIP. Его исходный код размещен на этом Githu

Как установить AirSonic на CentOS 7

Как установить AirSonic на CentOS 7

Используете другую систему? AirSonic - это бесплатный и потоковый сервер с открытым исходным кодом. В этом уроке я проведу вас через процесс развертывания

Как установить OrangeScrum на CentOS 7

Как установить OrangeScrum на CentOS 7

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

Как установить и настроить OrientDB Community Edition для CentOS 7

Как установить и настроить OrientDB Community Edition для CentOS 7

OrientDB - это мультимодельная СУБД NoSQL с открытым исходным кодом нового поколения. Благодаря поддержке нескольких моделей данных OrientDB может обеспечить большую функциональность и гибкость в

Как установить Subrion 4.1 CMS на Ubuntu 16.04 LAMP VPS

Как установить Subrion 4.1 CMS на Ubuntu 16.04 LAMP VPS

Используете другую систему? Subrion 4.1 CMS - это мощная и гибкая система управления контентом с открытым исходным кодом (CMS), которая обеспечивает интуитивно понятный и понятный контент.

Как установить DokuWiki на Ubuntu 16.04 LTS

Как установить DokuWiki на Ubuntu 16.04 LTS

Используете другую систему? DokuWiki - это вики-программа с открытым исходным кодом, написанная на PHP, для которой не требуется база данных. Хранит данные в текстовых файлах. DokuWik

Создание внешнего интерфейса HTML 5 RDP / SSH с использованием гуакамоле в Ubuntu 16.04 LTS

Создание внешнего интерфейса HTML 5 RDP / SSH с использованием гуакамоле в Ubuntu 16.04 LTS

Введение Цель этого руководства - избавиться от общедоступных соединений SSH и общедоступных RDP. Поместив все это за очень удобный клиент HTML5

Как установить и настроить CyberPanel в Ubuntu 18.04 LTS

Как установить и настроить CyberPanel в Ubuntu 18.04 LTS

Используете другую систему? Введение CyberPanel - одна из первых панелей управления на рынке, которая имеет открытый исходный код и использует OpenLiteSpeed. Что это

Как установить форум NodeBB на Fedora 28

Как установить форум NodeBB на Fedora 28

Используете другую систему? NodeBB - это форум на базе Node.js. Он использует веб-сокеты для мгновенного взаимодействия и уведомления в режиме реального времени. Исходный код NodeBB я

Как собрать Brotli из исходного кода на Debian 9

Как собрать Brotli из исходного кода на Debian 9

Используете другую систему? Brotli - это новый метод сжатия с лучшей степенью сжатия, чем в Gzip. Его исходный код публично размещен на Github. Thi

Установка Netdata в CentOS 7

Установка Netdata в CentOS 7

Используете другую систему? Netdata - восходящая звезда в области мониторинга показателей системы в режиме реального времени. По сравнению с другими инструментами того же рода, Netdata:

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

6 невероятных фактов о Nintendo Switch

6 невероятных фактов о Nintendo Switch

Многие из вас знают Switch, который выйдет в марте 2017 года, и его новые функции. Для тех, кто не знает, мы подготовили список функций, которые делают «Switch» обязательным гаджетом.

Технические обещания, которые все еще не выполнены

Технические обещания, которые все еще не выполнены

Вы ждете, когда технологические гиганты выполнят свои обещания? проверить, что осталось недоставленным.

Функциональные возможности уровней эталонной архитектуры больших данных

Функциональные возможности уровней эталонной архитектуры больших данных

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

Как ИИ может вывести автоматизацию процессов на новый уровень?

Как ИИ может вывести автоматизацию процессов на новый уровень?

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

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA стало довольно сложно решать пользователям за последние несколько лет. Сможет ли он оставаться эффективным в обнаружении спама и ботов в ближайшем будущем?

Технологическая сингулярность: далекое будущее человеческой цивилизации?

Технологическая сингулярность: далекое будущее человеческой цивилизации?

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

Телемедицина и удаленное здравоохранение: будущее уже здесь

Телемедицина и удаленное здравоохранение: будущее уже здесь

Что такое телемедицина, дистанционное здравоохранение и их влияние на будущее поколение? Это хорошее место или нет в ситуации пандемии? Прочтите блог, чтобы узнать мнение!

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Возможно, вы слышали, что хакеры зарабатывают много денег, но задумывались ли вы когда-нибудь о том, как они зарабатывают такие деньги? Давайте обсудим.

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Недавно Apple выпустила macOS Catalina 10.15.4, дополнительное обновление для исправления проблем, но похоже, что это обновление вызывает больше проблем, приводящих к поломке компьютеров Mac. Прочтите эту статью, чтобы узнать больше