HTTP tiesioginis srautas (HLS) yra labai tvirtas srautinio vaizdo perdavimo protokolas, įdiegtas Apple Inc. HLS naudoja HTTP operacijas, kurios kerta ugniasienes, tarpinius serverius ir gali būti lengvai platinami per CDN. Todėl ši technologija gali pasiekti daug didesnę žiūrovų auditoriją nei RTP ar kiti UDP pagrįsti protokolai. Didžioji dalis tiesioginių vaizdo įrašų internete šiandien yra priglobta brangiose sistemose, kuriose naudojama HLS, tačiau jos paprastai yra brangios ir reikalauja daug serverio išteklių. Ši instrukcija parodys, kaip nustatyti labai prieinamą Ubuntu 14.04 VULTR VPS, kad būtų galima atlikti HLS tiesioginės transliacijos įvykius naudojant tik atvirojo kodo programinę įrangą.
Pirmas žingsnis yra perskaityti ir nustatyti serverį pagal Vultr Doc " Nustatyti Nginx-RTMP Ubuntu 14.04 ". Šiame dokumente pateiktos instrukcijos buvo pačios išsamiausios sąrankos etape rašymo metu. Norėčiau paminėti, kad galbūt norėsite „nginx-1.7.5“ pakeisti „nginx-1.9.4“ arba bet kokia naujausia „Nginx“ versija. Kitas pasiūlymas yra kompiliuoti „Nginx“ su HTTP stuburo būsenos moduliu, kad vėliau galėtumėte stebėti, kiek tiesioginių HLS žiūrovų turite.
Užuot kompiliavęs su:
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
Naudokite šią eilutę atlikdami procedūrą, aprašytą būtinos sąlygos dokumente:
./configure --with-http_ssl_module --with-http_stub_status_module --add-module=../nginx-rtmp-module-master
Šiame vadove pateiktame pavyzdyje bus sukurti „tiesioginiai“ ir „mobilieji“ (optimizuoti) srautai ir bus naudojamas ffmpeg (įdiegtas ankstesnėje mokymo programoje), kad sugeneruotų koreguotą bitų spartą, mobiliesiems optimizuotą HLS srautą. Pavyzdyje taip pat bus parodyta, kaip priversti serverį automatiškai įrašyti jūsų tiesiogines transliacijas ir leisti atkurti įrašus kaip vaizdo įrašo pagal pareikalavimą (VOD) atkūrimo paslaugą.
Pirmiausia sukurkite aplankų struktūras, reikalingas tiesioginiams ir mobiliesiems HLS aprašams ir vaizdo įrašų fragmentams laikyti:
sudo mkdir /HLS
sudo mkdir /HLS/live
sudo mkdir /HLS/mobile
sudo mkdir /video_recordings
sudo chmod -R 777 /video_recordings
Tikriausiai būtų gera idėja įjungti užkardą, jei to dar nepadarėte. Jei taip, turite leisti srautą į Nginx ir HLS naudojamus prievadus. Jei norite kol kas veikti be ugniasienės, nekreipkite dėmesio į toliau pateiktą ufw skyrių.
sudo ufw limit ssh
sudo ufw allow 80
sudo ufw allow 1935
sudo ufw enable
HLS srautiniam perdavimui reikalinga žymiai skirtinga Nginx konfigūracija nei RTMP konfigūracija pirmame straipsnyje. Redaguokite nginx.conf
failą, kad galėtumėte naudoti toliau nurodytus žodžius, pakeisdami „mano ip“ ir „mano srauto raktas“ savo informacija. „Mano srauto raktas“ gali naudoti bet ką, tai tik unikalus ir jums naudingas žodis. Pirmiausia galite sukurti atsarginę pradinio konfigūracijos failo kopiją, tada įklijuokite pateiktą konfigūracijos informaciją į redaktorių, pakeisdami viską, kas ten buvo:
sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.original
sudo nano /usr/local/nginx/conf/nginx.conf
Nauja 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;
}
}
}
Norėdami išeiti, paspauskite Ctrl + X. Pasakykite „taip“, kad išsaugotumėte pakeitimus.
Šiame nginx.conf
faile galite rasti aiškių instrukcijų ir galimų kintamųjų pavyzdžių, jei savo mėgstamoje paieškos sistemoje ieškosite „nginx-rtmp direktyvų“. Jau keletą metų naudoju nginx-rtmp su HLS, nenaudodamas direktyvų „leisti skelbti“ ir „neleisti skelbti“, ir nemačiau nulio atvejų, kai žmonės naudotųsi / įsiveržtų į mano vaizdo serverius. Taigi aš tų direktyvų čia neįtraukiau. Perskaitykite ir pridėkite šias direktyvas, jei norite.
Pakeitę nginx.conf
failą, turite iš naujo paleisti Nginx, kad galėtumėte naudoti naują konfigūraciją:
sudo service nginx restart
Atidžiai stebėkite, ar nėra „Nginx“ klaidų pranešimų, ir pašalinkite visas klaidas, kurios galėjo atsirasti dėl rašybos klaidų, aplanko nuosavybės ar leidimų problemų. Jei neturite klaidų pranešimų, esate pasirengę sukurti kodavimo srautą.
Norėdami sukurti srautą, turite turėti vaizdo kodavimo įrenginį. Naudoju OBS (Open Broadcaster Software), kuri yra atvirojo kodo ir man puikiai tinka. Galima rinktis iš kitų sprendimų, kurie nepatenka į šios mokymo programos taikymo sritį. Neaprašysiu visko apie RTMP vaizdo kodavimo įrenginio konfigūravimą. Vis dėlto jiems visiems reikia maždaug tų pačių įvesties kintamųjų. Pagrindiniai nustatymai, kuriuos turėsite įvesti, kad galėtumėte naudoti tikslią nginx.conf
konfigūraciją ir gerai veikti daugelyje grotuvų / naršyklių / platformų, yra šie:
- Encoder-x264
- Kintama bitų sparta (ne CBR arba pastovi bitų sparta), kokybė aukščiausia
- Maksimalus bitų greitis - 600 kbps
- Garso kodekas-AAC
- Garso formatas - 44,1 khz
- Garso bitų sparta - 64 kbps
- FMS URL - "rtmp://my-ip:1935/live"
- Srauto raktas – „mano srauto raktas“
- Rezoliucija - 640x480
- FPS (kadrai per sekundę) -30
- CFR (nuolatinis kadrų dažnis) – taip
- Pagrindinių kadrų intervalas – 2 sekundės (vienas pagrindinis kadras kas 2 sekundes)
- x264 Encoding Profile-baseline (gali veikti su pagrindiniu – priklauso nuo naudojamo grotuvo)
- x264 CPU dabar - labai greitas
Rekomenduoju išbandyti įvairius koduotuvus ir su jais eksperimentuoti. Galbūt norėsite plataus formato koeficiento arba jo gali prireikti jūsų fotoaparatui (ar kitai transliacijai). Jei taip, būtinai pakeiskite šią informaciją kodavimo priemonėje ir formato santykį, nurodytą nginx.conf
failo, kurį pateikiau, skyriuje exec-ffmpeg ; kitu atveju gausite keistai atrodančius vaizdo įrašų kanalus.
Kai koduotuvas bus nustatytas, galėsite visa tai išbandyti. Paleiskite koduotuvą naudodami internetinę kamerą arba joje veikiantį bandomąjį pašarą. Šiuo metu transliaciją galite peržiūrėti naudodami VLC grotuvą naudodami tokius URL:
http://my-ip/live/my-stream-key/index.m3u8
http://my-ip/mobile/my-stream-key/index.m3u8
Tai atitinkamai jūsų pagrindiniam ir mobiliajam vaizdo įrašų srautui. Atitinkamai pakeiskite savo IP ir srauto raktą.
Sėkmingai /video_recordings
ištransliavus pirmąjį srautą, patikrinkite (per ssh arba ftp), ar jūsų tiesioginė transliacija buvo įrašyta į jūsų Vultr VPS aplanką. Taip pat galite pabandyti paleisti šį įrašytą failą VLC su tokiu URL adresu:
rtmp://my-ip/vod/filename.flv
Taip pat yra Nginx statistika (su Nginx stub_status). Norėdami peržiūrėti lankytojų / žiūrinčiųjų statistiką, eikite į:
http://my-ip/stats
Jei norite peržiūrėti vaizdo įrašą tinklalapyje, jums reikės įterpiamo grotuvo. Yra daug įterpiamųjų grotuvų, kurie leis HLS vaizdo įrašus. Jau keletą metų naudoju JW Player, bet nemokama versija neleis HLS. „Bitmovin“ „Flowplayer“ ir „Bitdash“ (be kitų sprendimų) yra pakankamai dosnūs, kad galėtų nemokamai pasiūlyti nekomercinę savo grotuvų versiją, kuri pavers jūsų HLS srautą įterptu į tinklalapį. Šiame straipsnyje aš išbandžiau juos abu ir radau, kad jie abu puikiai veikia su mano Vultr / Nginx pagrindu veikiančiu vaizdo serveriu. Trumpai parodysiu, kaip man pavyko „Flowplayer“ su savo bandomuoju įrenginiu.
Jei ketinate naudoti tiesioginį HLS srautinį perdavimą bet kokiu įprastu, nuolatiniu ar komerciniu būdu, siūlyčiau įsigyti licenciją iš „Flowplayer“ arba bet kurio grotuvo, kurį nuspręsite naudoti. Jūs gausite grotuvą, kuris turi mažiau apribojimų, daugiau funkcijų ir gali būti priskirtas jūsų organizacijai. Taip pat gausite paramą – tai gali būti labai svarbu. Išskyrus Vultr VPS, tai tikrai vienintelė su projektu susijusi kaina.
Prieš darydami ką nors kita, svarbu pasirūpinti vadinamaisiais „kryžminiais domenais“ taikomais apribojimais, kurie kitu atveju sustabdytų jūsų galimybę srautu perduoti į tinklalapį / svetainę. Sukurkite crossdomain.xml
failą savo nginx/html
aplanke ir įdėkite jame instrukcijas, kad duomenys galėtų tekėti tarp domenų:
sudo nano /usr/local/nginx/html/crossdomain.xml
Pirmiausia nukopijuokite (iš šio puslapio) ir įklijuokite (dešiniuoju pelės mygtuku spustelėkite) į nano redaktoriaus lauką šiuos XML duomenis:
<?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>
Paspauskite Ctrl + O, kad išrašytumėte, tada Ctrl + X, kad išsaugotumėte failą diske ir išeitumėte.
Paėmiau „Flowplayer“ HTML5 (6.0.3 versija), kurį išpakavus davė daug failų ir aplanką. Įkėliau visus failus ir aplanką į Nginx / HTML šakninio aplanko poaplankį, kurį pavadinau „flowplayer“. Tikslus kelias buvo /usr/local/nginx/html/flowplayer
.
Norėdami išbandyti mūsų vaizdo įrašą, kai jis įterptas į tinklalapį, sukurkite keletą HTML failų aplanko Nginx/HTML šaknyje naudodami nano ir užpildykite juos tokiu turiniu.
Failas:
sudo nano /usr/local/nginx/html/hls.html
HTML kodas:
<!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>
Failas:
sudo nano /usr/local/nginx/html/hls_progressive.html
HTML kodas:
<!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>
Būtinai pakeiskite „my-ip“ ir „my-stream-key“ savo duomenimis.
flowplayer/skin/functional.css
Stiliaus lape ženklą „#“ turite pakeisti keliu href="#"
. Mokomoji programinė įranga pašalina kelią. src=""
Dalyje turite užpildyti URL – jį pašalina mokymo programinė įranga, naudokite http://my-ip/live/my-stream-key/index.m3u8
ir http://my-ip/mobile/my-stream-key/index.m3u8
atitinkamai. Taip pat turite pridėti scenarijaus src
žymas abiem jquery-1.11.2.min.js
ir flowplayer.min.js
. Mokymo programinė įranga pašalina žymas. Galite sužinoti, kaip sukurti šias žymas, peržiūrėję example html
failą, esantį su Flowplayer rinkiniu.
Paleiskite koduotuvą naudodami internetinę kamerą arba joje veikiantį bandomąjį pašarą. Savo transliaciją galite peržiūrėti naršyklėje naudodami šiuos URL:
http://my-ip/hls.html
http://my-ip/hls_progressive.html
Pirmame puslapyje tiesiog rodomas kiekvienas jūsų srautas – pagrindinis ir mobiliosios platformos. Galėsite juos abu paleisti ir peržiūrėti. Pastebėsite, kad mobiliosios platformos srautas yra mažesnis. Šie veiksmai yra tik tam, kad įsitikintumėte, jog viskas veikia.
Antrame puslapyje rodomas vienas srautas. Tačiau jis nustatytas tokiu būdu, kuris vadinamas „progresyviu srautiniu perdavimu“. Tai reiškia, kad žiūrinčiajam paleidus vaizdo įrašą, tiek serveris, tiek grotuvas bando suteikti žiūrovui didelės spartos aukštos kokybės srautą, jei žiūrinčiojo ryšys gali jį palaikyti. Jei jų ryšys yra prastas ir jis negali palaikyti ryšio, jis nuleidžiamas iki mažesnio bitų spartos (mobiliojo ryšio) srauto, kurio pralaidumas yra 200 kbps mažesnis. Jei norite, galite sukurti daugiau laipsniškų, progresyvių srautų naudodami ffmpeg ir sukonfigūruoti juos naudodami mano pavyzdį.
Išbandžiau šią konfigūraciją su vienu branduoliu, 1GB Vultr VPS, ir sužinojau, kad naudojant vieną tiesioginį srautą ir trans-rated srautą mobiliesiems, kuriuos jis sukuria naudojant ffmpeg, procesoriaus naudojimas buvo mažesnis nei 35% ir sunaudojo tik 100 MB mano 1GB RAM. Dabar tai labai efektyvi sąranka.
Jei planuojate transliuoti vaizdo įrašą, kurio pikselių matmenys yra daug didesni nei SD, galite pastebėti, kad turėsite naudoti galingesnį VPS. Man tai buvo įdomu ir paleidau pagrindinį srautą iki 1280 x 960 pikselių ir 2 Mbps – tai dar labiau apkraunu dalykus. Tačiau VPS vis tiek naudojo tik 50% procesoriaus, o atminties kiekis liko 100 MB. Pridėjau tuziną peržiūros programų / naršyklių ir tai beveik nepakeitė VPS apkrovos – padidėjo tik naudojamas pralaidumas. Esu tikras, kad papildomų trans-rated srautų kūrimas naudojant ffmpeg ir toliau apkraustų sistemą.
Naudojau šio tipo serverį gamybinėse aplinkose, kuriose vienu metu dirba nuo 50 iki 100 vartotojų, ir pastebėjau, kad išteklius sunaudojama labai mažai didėjant žiūrinčiųjų ryšiams. Eksperimentuokite su juo. Tačiau manau, kad dauguma vartotojų būtų patenkinti naudodami vieno branduolio, 1 GB VPS. Mėgaukitės nauju HLS srautinio perdavimo serveriu!