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
конфигурацию и хорошо работать на большинстве плееров / браузеров / платформ:
- Кодер-x264
- Переменный битрейт (не CBR или постоянный битрейт), высочайшее качество
- Максимальный битрейт-600kbps
- Аудио-кодек-AAC
- Аудио-Format-44,1
- Аудио-битрейт-64kbps
- FMS URL- "rtmp: // my-ip: 1935 / live"
- Ключ потока - "мой-поток-ключ"
- Разрешение 640х480-
- FPS (кадров в секунду) -30
- CFR (постоянная частота кадров) - да
- Интервал ключевого кадра - 2 секунды (один ключевой кадр каждые 2 секунды)
- Профиль кодирования x264 - базовый уровень (может работать с основным - зависит от используемого проигрывателя)
- 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!