HTTP Live Streaming (HLS) er en meget robust streaming-videoprotokol implementeret af Apple Inc. HLS bruger HTTP-transaktioner, som krydser firewalls, proxyer og kan distribueres gennem CDN'er med lethed. Derfor er denne teknologi i stand til at nå et meget større seerpublikum end RTP eller andre UDP-baserede protokoller. Meget af livestreaming af video online i dag hostes af dyre systemer, som bruger HLS, men de er generelt dyre og kræver mange serverressourcer. Denne vejledning viser dig, hvordan du konfigurerer en meget overkommelig Ubuntu 14.04 VULTR VPS til at lave HLS live streaming-begivenheder ved kun at bruge open source-software.
Det første trin er at læse og opsætte din server i henhold til Vultr Doc " Setup Nginx-RTMP on Ubuntu 14.04 ". Instruktionerne i det dokument var i skrivende stund den mest omfattende for opsætningsfasen. Jeg vil nævne, at du måske ønsker at erstatte "nginx-1.7.5" med "nginx-1.9.4" eller hvad den nyeste version af Nginx er tilgængelig. Det andet forslag er at kompilere Nginx med HTTP-stub-statusmodulet for at give dig selv mulighed for at overvåge, hvor mange live HLS-seere du har senere.
I stedet for at kompilere med:
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
Brug denne streng i proceduren skitseret i forudsætningsdokumentet:
./configure --with-http_ssl_module --with-http_stub_status_module --add-module=../nginx-rtmp-module-master
Eksemplet i denne vejledning vil skabe både "live" og "mobile" (optimerede) streams og vil bruge ffmpeg (installeret i den forrige tutorial) til at generere den bithastighedsjusterede, mobiloptimerede HLS-stream. Eksemplet viser også, hvordan du får serveren til at optage dine livestreams automatisk og giver dig mulighed for at afspille optagelserne som en video on demand (VOD) genafspilningstjeneste.
Opret først de mappestrukturer, der er nødvendige for at holde de levende og mobile HLS-manifester og videofragmenter:
sudo mkdir /HLS
sudo mkdir /HLS/live
sudo mkdir /HLS/mobile
sudo mkdir /video_recordings
sudo chmod -R 777 /video_recordings
Det er nok en god idé at have din firewall tændt, hvis du ikke allerede har gjort det. Hvis det er tilfældet, skal du tillade trafik ind i de porte, der bruges af Nginx og HLS. Hvis du gerne vil køre uden firewall indtil videre, skal du ignorere ufw-afsnittet nedenfor.
sudo ufw limit ssh
sudo ufw allow 80
sudo ufw allow 1935
sudo ufw enable
HLS-streaming kræver en væsentlig anden Nginx-konfiguration fra RTMP-konfigurationen i den første artikel. Rediger din nginx.conffil for at bruge følgende ved at erstatte "my-ip" og "my-stream-key" med dine oplysninger. Du kan bruge alt, hvad du vil, til "my-stream-key", det er bare et ord, der er unikt og nyttigt for dig. Du ønsker måske at sikkerhedskopiere din originale konfigurationsfil først, og indsæt derefter mine medfølgende konfigurationsoplysninger i editoren og erstatter alt, hvad der var der:
sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.original
sudo nano /usr/local/nginx/conf/nginx.conf
Ny 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;
}
}
}
Tryk på Ctrl + X for at afslutte. Sig "ja" for at gemme ændringerne.
Du kan finde klare instruktioner og eksempler på de mulige variabler i denne nginx.conffil, hvis du spørger din yndlingssøgemaskine efter "nginx-rtmp-direktiver". Jeg har brugt nginx-rtmp med HLS i nogle år nu uden at bruge direktiverne "tillad udgivelse" og "afvis udgivelse", og jeg har ikke set nogen tilfælde af folk, der bruger/invaderer mine videoservere. Så jeg medtog ikke disse direktiver her. Læs om og tilføj disse direktiver, hvis du ønsker det.
Efter at have ændret nginx.conffilen, skal du genstarte Nginx for at bruge den nye konfiguration:
sudo service nginx restart
Hold nøje øje med eventuelle Nginx-fejlmeddelelser og adresser eventuelle fejl, der kan være forårsaget af stavefejl, mappeejerskab eller problemer med tilladelser. Hvis du ikke har nogen fejlmeddelelser, er du klar til at oprette din kodestrøm.
Du skal have en videokoder for at oprette streamen. Jeg bruger OBS (Open Broadcaster Software) - som er open source og fungerer godt for mig. Der er andre løsninger at vælge imellem, som er uden for denne tutorials rammer. Jeg vil ikke dække alt om konfiguration af en RTMP-videokoder. De kræver dog alle nogenlunde de samme inputvariabler. De nøgleindstillinger, du skal indtaste for at bruge min nøjagtige nginx.confkonfiguration og fungere godt på tværs af de fleste spillere/browsere/platforme, er som følger:
- Encoder-x264
- Variabel bitrate (ikke CBR eller konstant bithastighed), kvalitet højest
- Maks bithastighed - 600 kbps
- Audio-Codec-AAC
- Lyd-format-44,1 khz
- Lyd-bithastighed - 64 kbps
- FMS URL-"rtmp://my-ip:1935/live"
- Stream nøgle-"min-stream-nøgle"
- Opløsning - 640x480
- FPS (frames per second) -30
- CFR (Constant Frame Rate) - Ja
- Keyframe interval-2 sekunder (én keyframe hvert 2. sekund)
- x264 Encoding Profile-baseline (kan fungere med main—afhængigt af den anvendte afspiller)
- x264 CPU Nuværende-meget hurtig
Jeg anbefaler at prøve forskellige indkodere og eksperimentere med dem. Du ønsker måske et bredt billedformat - eller dit kamera (eller andre udsendelsesmaterialer) kan kræve det. Hvis det er tilfældet, skal du sørge for at ændre disse oplysninger i din encoder og også billedformatet, der er angivet i exec-ffmpeg-sektionen af nginx.conffilen, som jeg har leveret; ellers får du nogle fede videofeeds.
Når din encoder er sat op, kan du teste det hele. Start encoderen med dit webcam eller en slags testfoder kørende på det. Du kan se din udsendelse på dette tidspunkt med VLC-afspiller ved hjælp af URL'er som:
http://my-ip/live/my-stream-key/index.m3u8
http://my-ip/mobile/my-stream-key/index.m3u8
Disse er til henholdsvis dine primære og dine mobile videostreams. Erstat din IP og stream nøgle i overensstemmelse hermed.
Når du har udsendt din første stream, skal du kontrollere (via ssh eller ftp), at din live-udsendelse blev optaget i /video_recordingsmappen på din Vultr VPS. Du kan også prøve at afspille denne optagede fil i VLC med en URL som:
rtmp://my-ip/vod/filename.flv
Nginx-statistikker er også tilgængelige (med Nginx stub_status). For at se besøgs-/seerstatistik skal du gå til:
http://my-ip/stats
For at se din video på en webside skal du bruge en indlejrbar afspiller. Der er mange indlejrbare afspillere tilgængelige, som vil afspille HLS-video. Jeg har brugt JW Player i nogle år nu, men den gratis version vil ikke spille HLS. Flowplayer og Bitdash af Bitmovin (blandt andre løsninger) er generøse nok til at tilbyde en ikke-kommerciel version af deres spillere gratis, som vil gøre din HLS-stream indlejret på en webside. Til denne artikel har jeg prøvet dem begge og fundet dem begge til at fungere ganske godt med min Vultr/Nginx-baserede videoserver. Jeg vil kort vise, hvordan jeg fik Flowplayer i gang med min testbed-maskine.
Hvis du vil bruge live HLS-streaming på en almindelig, vedvarende eller kommerciel måde, vil jeg opfordre dig til at købe en licens fra Flowplayer eller hvilken spiller du vælger at bruge. Du vil få en spiller, som har færre begrænsninger, flere funktioner og kan mærkes til din organisation. Du får også støtte - hvilket kan være meget vigtigt. Bortset fra Vultr VPS, er dette virkelig den eneste omkostning forbundet med projektet.
Før du gør noget andet, er det vigtigt at tage sig af det, der kaldes "cross-domain" begrænsninger, som ellers ville lukke ned for din mulighed for at streame til en webside/hjemmeside. Opret en crossdomain.xmlfil i din nginx/htmlmappe og læg instruktioner i den for at tillade data at flyde mellem domæner:
sudo nano /usr/local/nginx/html/crossdomain.xml
Kopiér først (fra denne side) og indsæt derefter (højreklik) i nano-editor-feltet følgende XML-data:
<?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>
Tryk på Ctrl + O for at skrive ud, derefter Ctrl + X for at gemme filen på disken og afslutte.
Jeg fik fat i HTML5 (version 6.0.3) af Flowplayer, som gav mig et antal filer og en mappe, når den blev pakket ud. Jeg uploadede alle filerne og mappen til en undermappe af Nginx/HTML-rodmappen, som jeg kaldte "flowplayer". Den nøjagtige vej var /usr/local/nginx/html/flowplayer.
For at teste vores video, når den er indlejret på en webside, skal du oprette et par HTML-filer i roden af Nginx/HTML-mappen ved hjælp af nano og udfylde dem med følgende indhold.
Fil:
sudo nano /usr/local/nginx/html/hls.html
HTML-kode:
<!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>
Fil:
sudo nano /usr/local/nginx/html/hls_progressive.html
HTML-kode:
<!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>
Sørg for at erstatte "my-ip" og "my-stream-key" med dine data.
Du skal erstatte flowplayer/skin/functional.css"#"-tegnet i stilarket med stien href="#". Selvstudiesoftwaren fjerner stien. Du skal udfylde en URL i src=""del - det bliver skrabet ud af tutorial software, brug http://my-ip/live/my-stream-key/index.m3u8og http://my-ip/mobile/my-stream-key/index.m3u8hhv. Du skal også tilføje script- srctags i hovedet for både jquery-1.11.2.min.jsog for flowplayer.min.js. Mærkerne bliver fjernet af tutorial-softwaren. Du kan finde ud af, hvordan du laver disse tags, ved at se på example htmlfilen, der følger med Flowplayer-sættet.
Start encoderen med dit webcam eller en slags testfoder kørende på det. Du kan se din udsendelse i en browser ved hjælp af følgende URL'er:
http://my-ip/hls.html
http://my-ip/hls_progressive.html
Den første side viser simpelthen hver af dine streams - den primære og den mobile platform. Du vil være i stand til at starte dem begge og se dem. Du vil bemærke, at den mobile platformstrøm er mindre i størrelse. Disse trin er kun for at sikre, at alt kører.
Den anden side viser en enkelt strøm. Men det er sat op på en måde, som kaldes "progressiv streaming". Hvad dette betyder er, at når en seer afspiller videoen, forsøger både serveren og afspilleren at give seeren streamen med høj bithastighed og høj kvalitet, hvis seernes forbindelse kan opretholde den. Hvis deres forbindelse er dårlig, og den ikke kan opretholde forbindelsen, ruller den ned til at vise streamingen med lavere bithastighed (mobil), som er 200 kbps lavere i båndbredde. Hvis du ville, kunne du oprette mere graduerede, progressive streams med ffmpeg og konfigurere dem ved hjælp af mit eksempel.
Jeg har testet denne konfiguration på en enkelt kerne, 1 GB Vultr VPS, og jeg fandt ud af, at med en enkelt livestream, plus den transvurderede mobilstream, den skaber med ffmpeg, var cpu-bruget mindre end 35 %, og det havde kun forbrugt 100 MB min 1GB ram. Det er nu en meget effektiv opsætning.
Hvis du planlægger at streame video, som er meget større i pixeldimensioner end SD, kan du opleve, at du skal bruge en mere kraftfuld VPS. Jeg var nysgerrig efter dette og kørte min mainstream op til 1280x960 pixels og 2Mbps - hvilket satte ekstra belastning på tingene. Men VPS'en brugte stadig kun 50% CPU, og hukommelsesforbruget forblev på 100MB. Jeg tilføjede et dusin seere/browsere, og det gjorde næsten ingen forskel i belastningen på VPS'en - kun den brugte båndbredde steg. Jeg er sikker på, at oprettelse af yderligere transvurderede streams med ffmpeg ville fortsætte med at belaste systemet yderligere.
Jeg har brugt denne type server i produktionsmiljøer med mellem 50 og 100 samtidige brugere og fandt ud af, at ressourceforbruget steg meget lidt med stigende seerforbindelser. Eksperimenter med det. Men jeg tror, at de fleste brugere ville være glade for at bruge en single-core, 1GB VPS. Nyd din nye HLS-streamingserver!