HTTP Live Streaming (HLS) je vrlo robustan streaming video protokol koji implementira Apple Inc. HLS koristi HTTP transakcije koje prolaze kroz vatrozide, proxy servere i mogu se s lakoćom distribuirati putem CDN-ova. Stoga ova tehnologija može doseći mnogo veću publiku nego RTP ili drugi UDP protokoli. Veći dio video prijenosa uživo na mreži danas se održava u skupim sustavima koji koriste HLS, ali su općenito skupi i zahtijevaju puno poslužiteljskih resursa. Ovaj vodič će vam pokazati kako postaviti vrlo pristupačan Ubuntu 14.04 VULTR VPS za prijenos HLS događaja uživo koristeći samo softver otvorenog koda.
Prvi korak je čitanje i postavljanje vašeg poslužitelja u skladu s Vultr Doc-om " Postavljanje Nginx-RTMP-a na Ubuntu 14.04 ". Upute u tom dokumentu bile su najopsežnije za fazu postavljanja, u vrijeme pisanja. Spomenuo bih da biste možda željeli zamijeniti "nginx-1.7.5" s "nginx-1.9.4" ili bilo kojom najnovijom verzijom Nginxa koja je dostupna. Drugi prijedlog je da kompajlirate Nginx sa statusnim modulom HTTP stuba kako biste sebi dali mogućnost pratiti koliko gledatelja uživo HLS-a imate kasnije.
Umjesto sastavljanja sa:
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
Upotrijebite ovaj niz u postupku opisanom u preduvjetnom dokumentu:
./configure --with-http_ssl_module --with-http_stub_status_module --add-module=../nginx-rtmp-module-master
Primjer u ovom vodiču kreirat će i "žive" i "mobilne" (optimizirane) streamove i koristit će ffmpeg (instaliran u prethodnom vodiču) za generiranje HLS streama prilagođene brzine prijenosa, optimiziranog za mobilne uređaje. Primjer će također pokazati kako natjerati poslužitelj da automatski snima vaše streamove uživo i kako bi vam omogućio reproduciranje snimaka kao uslugu reprodukcije videa na zahtjev (VOD).
Najprije stvorite strukture mapa potrebne za držanje HLS manifesta i video fragmenata uživo i mobilnih:
sudo mkdir /HLS
sudo mkdir /HLS/live
sudo mkdir /HLS/mobile
sudo mkdir /video_recordings
sudo chmod -R 777 /video_recordings
Vjerojatno je dobra ideja uključiti vatrozid ako to već niste učinili. Ako je tako, morate dopustiti promet na portove koje koriste Nginx i HLS. Ako za sada želite raditi bez vatrozida, zanemarite ufw odjeljak u nastavku.
sudo ufw limit ssh
sudo ufw allow 80
sudo ufw allow 1935
sudo ufw enable
HLS streaming zahtijeva značajno drugačiju Nginx konfiguraciju od RTMP konfiguracije u prvom članku. Uredite svoju nginx.confdatoteku kako biste koristili sljedeće, zamijenivši "my-ip" i "my-stream-key" svojim podacima. Možete koristiti sve što želite za "my-stream-key" to je samo riječ koja vam je jedinstvena i korisna. Možda ćete htjeti prvo napraviti sigurnosnu kopiju svoje izvorne konfiguracijske datoteke, a zatim zalijepiti moje dostavljene podatke o konfiguraciji u uređivač, zamjenjujući sve što je tamo bilo:
sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.original
sudo nano /usr/local/nginx/conf/nginx.conf
Novi 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;
}
}
}
Pritisnite Ctrl + X za izlaz. Recite "da" da biste spremili promjene.
U ovoj nginx.confdatoteci možete pronaći jasne upute i primjere mogućih varijabli ako svojoj omiljenoj tražilici zatražite "nginx-rtmp direktive". Koristim nginx-rtmp s HLS-om već nekoliko godina, bez korištenja direktiva "dopusti objavljivanje" i "deny publish" i vidio sam nula slučajeva ljudi koji koriste/napadaju moje video poslužitelje. Stoga te direktive nisam uključio ovdje. Pročitajte i dodajte ove direktive ako želite.
Nakon promjene nginx.confdatoteke, morate ponovno pokrenuti Nginx da biste koristili novu konfiguraciju:
sudo service nginx restart
Pažljivo pratite bilo kakve poruke o pogrešci Nginxa i riješite sve pogreške koje su mogle biti uzrokovane pogrešnim pravopisom, vlasništvom mape ili problemima s dopuštenjima. Ako nemate poruke o pogrešci, onda ste spremni za kreiranje kodiranog streama.
Morate imati video koder da biste stvorili stream. Koristim OBS (Open Broadcaster Software) - koji je otvorenog koda i dobro mi radi. Postoje i druga rješenja koja su izvan dosega ovog vodiča. Neću pokrivati sve o konfiguraciji RTMP video kodera. Svi oni zahtijevaju otprilike iste ulazne varijable. Ključne postavke koje ćete morati unijeti kako biste koristili moju točnu nginx.confkonfiguraciju i dobro funkcionirali na većini igrača/preglednika/platforma su sljedeće:
- Enkoder-x264
- Varijabilna brzina prijenosa (ne CBR ili stalna brzina prijenosa), najviša kvaliteta
- Maksimalna brzina prijenosa - 600 kbps
- Audio-kodek-AAC
- Audio-format-44,1 kHz
- Brzina prijenosa zvuka - 64 kbps
- FMS URL-"rtmp://my-ip:1935/live"
- Ključ streama-"my-stream-key"
- Rezolucija-640x480
- FPS (okviri u sekundi) -30
- CFR (Constant Frame Rate) - Da
- Interval ključnog kadra - 2 sekunde (jedan ključni kadar svake 2 sekunde)
- x264 Encoding Profile-baseline (može raditi s glavnim - ovisi o korištenom igraču)
- x264 CPU Prisutan-vrlo brz
Preporučujem isprobavanje različitih kodera i eksperimentiranje s njima. Možda ćete poželjeti široki omjer širine i visine - ili to može zahtijevati vaša kamera (ili drugi materijali za emitiranje). Ako je tako, svakako promijenite ove podatke u svom koderu, kao i omjer slike naveden u odjeljku exec-ffmpeg nginx.confdatoteke koju sam dostavio; inače ćete dobiti neke glupave video feedove.
Nakon što je vaš koder postavljen, možete sve testirati. Pokrenite koder sa svojom web kamerom ili nekom vrstom testne hrane koja radi na njoj. U ovom trenutku možete pogledati svoje emitiranje s VLC playerom koristeći URL-ove kao što su:
http://my-ip/live/my-stream-key/index.m3u8
http://my-ip/mobile/my-stream-key/index.m3u8
To su za vaše glavne i mobilne videostreamove. Zamijenite svoj IP i ključ streama u skladu s tim.
Nakon što ste uspješno emitirali svoju prvu provjeru streama (putem ssh-a ili ftp-a) je li vaš prijenos uživo snimljen u /video_recordingsmapi na vašem Vultr VPS-u. Također možete pokušati reproducirati ovu snimljenu datoteku u VLC-u s URL-om kao što je:
rtmp://my-ip/vod/filename.flv
Nginx statistika je također dostupna (s Nginx stub_status). Za pregled statistike posjetitelja/gledatelja, pristupite:
http://my-ip/stats
Da biste vidjeli svoj video na web-stranici, trebat će vam player koji se može ugraditi. Dostupni su mnogi reproduktori koji se mogu ugraditi i koji će reproducirati HLS video. Koristim JW Player već nekoliko godina, ali besplatna verzija neće igrati HLS. Flowplayer i Bitdash od Bitmovin (između ostalih rješenja) dovoljno su velikodušni da besplatno ponude nekomercijalnu verziju svojih playera koja će vaš HLS stream učiniti ugrađenim u web stranicu. Za ovaj članak, isprobao sam ih oba i otkrio da oba prilično dobro funkcioniraju s mojim video poslužiteljem koji se temelji na Vultr/Nginxu. Ukratko ću pokazati kako sam pokrenuo Flowplayer sa svojim testnim strojem.
Ako namjeravate koristiti HLS streaming uživo na bilo koji redoviti, kontinuirani ili komercijalni način, potaknuo bih vas da kupite licencu od Flowplayera ili bilo kojeg igrača koji odlučite koristiti. Dobit ćete igrača koji ima manje ograničenja, više značajki i koji se može brendirati za vašu organizaciju. Također ćete dobiti podršku – što može biti vrlo važno. Osim Vultr VPS-a, ovo je zapravo jedini trošak povezan s projektom.
Prije nego što učinite bilo što drugo, važno je voditi računa o onome što se naziva ograničenjima "više domena", koja bi inače isključila vašu mogućnost strujanja na web-stranicu/web-stranicu. Napravite crossdomain.xmldatoteku u svojoj nginx/htmlmapi i stavite upute u nju kako biste omogućili protok podataka između domena:
sudo nano /usr/local/nginx/html/crossdomain.xml
Prvo kopirajte (s ove stranice), a zatim zalijepite (desni klik) u polje nano uređivača sljedeće XML podatke:
<?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>
Pritisnite Ctrl + O za pisanje, zatim Ctrl + X za spremanje datoteke na disk i izlaz.
Zgrabio sam HTML5 (verzija 6.0.3) Flowplayera koji mi je dao niz datoteka i mapu kada sam raspakirao. Učitao sam sve datoteke i mapu u podmapu Nginx/HTML korijenske mape koju sam nazvao "flowplayer". Točan put je bio /usr/local/nginx/html/flowplayer.
Kako biste testirali naš video kada je ugrađen u web stranicu, stvorite nekoliko HTML datoteka u korijenu mape Nginx/HTML pomoću nanoa i popunite ih sljedećim sadržajem.
Datoteka:
sudo nano /usr/local/nginx/html/hls.html
HTML kod:
<!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>
Datoteka:
sudo nano /usr/local/nginx/html/hls_progressive.html
HTML kod:
<!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>
Svakako zamijenite "my-ip" i "my-stream-key" svojim podacima.
Morate zamijeniti put flowplayer/skin/functional.cssza znak "#" u tablici stilova href="#". Softver za tutorial uklanja put. Morate ispuniti URL u src=""dijelu - uklanja ga softver za tutorial, koristite http://my-ip/live/my-stream-key/index.m3u8i http://my-ip/mobile/my-stream-key/index.m3u8, respektivno. Također morate dodati srcoznake skripte u glavu jquery-1.11.2.min.jsi za i za flowplayer.min.js. Softver za tutorial uklanja oznake. Možete saznati kako oblikovati ove oznake gledajući example htmldatoteku uključenu u Flowplayer kit.
Pokrenite koder sa svojom web kamerom ili nekom vrstom testne hrane koja radi na njoj. Svoje emitiranje možete pogledati u pregledniku koristeći sljedeće URL-ove:
http://my-ip/hls.html
http://my-ip/hls_progressive.html
Prva stranica jednostavno prikazuje svaki vaš stream - glavni i onaj na mobilnoj platformi. Moći ćete ih pokrenuti i pogledati. Primijetit ćete da je stream mobilne platforme manji. Ovi koraci služe samo kako bi bili sigurni da sve radi.
Druga stranica prikazuje jedan stream. Ali postavljen je na način koji se zove "progresivni streaming". To znači da kada gledatelj reproducira video, i poslužitelj i player pokušavaju pružiti gledatelju stream velike brzine prijenosa i visoke kvalitete ako ga veza gledatelja može održati. Ako je njihova veza loša i ne može održati vezu, spušta se na prikaz niže bitrate (mobilnog) streama koji je 200 kbps niži u propusnosti. Ako želite, možete kreirati postupnije, progresivne streamove s ffmpeg-om i konfigurirati ih koristeći moj primjer.
Testirao sam ovu konfiguraciju na jednoj jezgri, 1GB Vultr VPS-a i otkrio sam da je s jednim streamom uživo, plus prijenosom s prijenosom na mobilnom uređaju koji stvara s ffmpeg-om, korištenje CPU-a bilo manje od 35% i da je potrošio samo 100MB moj 1GB ram memorije. Sada je to vrlo učinkovito postavljanje.
Ako planirate streamati video koji je u pikselima puno veći od SD-a, možda ćete otkriti da morate koristiti moćniji VPS. To me zanimalo i pokrenuo sam glavni stream do 1280x960 piksela i 2Mbps - dodatno opteretivši stvari. Ali VPS je i dalje koristio samo 50% CPU-a, a upotreba memorije je ostala na 100 MB. Dodao sam desetak pregledača/preglednika i gotovo da nije bilo razlike u opterećenju VPS-a - samo se povećala širina pojasa. Siguran sam da bi stvaranje dodatnih trans-rated streamova s ffmpeg-om nastavilo dodatno opterećivati sustav.
Koristio sam ovu vrstu poslužitelja u proizvodnim okruženjima s između 50 i 100 istodobnih korisnika i otkrio da je korištenje resursa vrlo malo poraslo s povećanjem povezivanja gledatelja. Eksperimentirajte s tim. Ali mislim da bi većina korisnika bila zadovoljna korištenjem jednojezgrenog VPS-a od 1 GB. Uživajte u svom novom HLS streaming serveru!