Stel Nginx in op Ubuntu om Live HLS-video te streamen

HTTP Live Streaming (HLS) is een zeer robuust streaming videoprotocol geïmplementeerd door Apple Inc. HLS maakt gebruik van HTTP-transacties die firewalls en proxy's doorlopen en gemakkelijk via CDN's kunnen worden gedistribueerd. Daarom kan deze technologie een veel groter kijkpubliek bereiken dan RTP of andere op UDP gebaseerde protocollen. Een groot deel van de livestreamingvideo die vandaag online wordt gehost, wordt gehost door dure systemen die HLS gebruiken, maar deze zijn over het algemeen duur en vereisen veel serverbronnen. Deze tutorial laat je zien hoe je een zeer betaalbare Ubuntu 14.04 VULTR VPS opzet om HLS live streaming-evenementen te doen met alleen open source software.

De eerste stap is het lezen en instellen van uw server volgens het Vultr Doc " Setup Nginx-RTMP op Ubuntu 14.04 ". De instructies in dat document waren op het moment van schrijven de meest uitgebreide voor de installatiefase. Ik zou willen vermelden dat je misschien "nginx-1.7.5" wilt vervangen door "nginx-1.9.4" of wat de laatste versie van Nginx ook is. De andere suggestie is om Nginx te compileren met de HTTP-stub-statusmodule om jezelf de mogelijkheid te geven te controleren hoeveel live HLS-kijkers je later hebt.

In plaats van te compileren met:

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

Gebruik deze tekenreeks in de procedure die wordt beschreven in het vereiste document:

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

Het voorbeeld in deze tutorial zal zowel "live" als "mobiele" (geoptimaliseerde) streams creëren en zal ffmpeg (geïnstalleerd in de vorige tutorial) gebruiken om de voor bitsnelheid aangepaste, voor mobiel geoptimaliseerde HLS-stream te genereren. Het voorbeeld laat ook zien hoe u ervoor kunt zorgen dat de server uw livestreams automatisch opneemt en dat u de opnames kunt afspelen als een video on demand (VOD) -herhalingsservice.

Maak eerst de mapstructuren die nodig zijn om de live en mobiele HLS-manifesten en videofragmenten te bewaren:

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

Het is waarschijnlijk een goed idee om uw firewall aan te zetten als u dat nog niet heeft gedaan. Als dat zo is, moet u verkeer toestaan ​​naar de poorten die worden gebruikt door Nginx en HLS. Als u voorlopig zonder de firewall wilt werken, negeert u de onderstaande ufw-sectie.

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

HLS-streaming vereist een aanzienlijk andere Nginx-configuratie dan de RTMP-configuratie in het eerste artikel. Bewerk uw nginx.confbestand om het volgende te gebruiken, waarbij u "mijn-ip" en "mijn-stroom-sleutel" vervangt door uw gegevens. U kunt alles gebruiken wat u maar wilt voor "my-stream-key", het is slechts een woord dat uniek en nuttig voor u is. Mogelijk wilt u eerst een back-up maken van uw oorspronkelijke configuratiebestand en vervolgens mijn meegeleverde configuratie-informatie in de editor plakken, waarbij u alles vervangt wat er was:

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

Nieuwe 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;
}   
}
}

Druk op Ctrl + X om af te sluiten. Zeg "ja" om de wijzigingen op te slaan.

U kunt duidelijke instructies en voorbeelden van de mogelijke variabelen in dit nginx.confbestand vinden als u uw favoriete zoekmachine zoekt op "nginx-rtmp directives". Ik gebruik nginx-rtmp al enkele jaren met HLS, zonder de richtlijnen "toestaan ​​publiceren" en "weigeren publiceren" te gebruiken en ik heb nul gevallen gezien van mensen die mijn videoservers gebruiken / binnendringen. Dus die richtlijnen heb ik hier niet opgenomen. Lees deze richtlijnen en voeg ze toe als u dat wilt.

Na het wijzigen van het nginx.confbestand moet u Nginx opnieuw opstarten om de nieuwe configuratie te gebruiken:

sudo service nginx restart

Let goed op eventuele Nginx-foutmeldingen en los eventuele fouten op die mogelijk zijn veroorzaakt door spelfouten, mapbezit of problemen met toestemmingen. Als je geen foutmeldingen hebt, ben je klaar om je coderingsstream te maken.

Je moet een video-encoder hebben om de stream te maken. Ik gebruik OBS (Open Broadcaster Software) - dat is open-source en werkt goed voor mij. U kunt uit andere oplossingen kiezen, die buiten het bestek van deze zelfstudie vallen. Ik zal niet alles behandelen over het configureren van een RTMP-video-encoder. Ze hebben echter allemaal ongeveer dezelfde invoervariabelen nodig. De belangrijkste instellingen die u moet invoeren om mijn exacte nginx.confconfiguratie te gebruiken en om goed te functioneren in de meeste spelers / browsers / platforms zijn als volgt:

  1. Encoder-x264
  2. Variabele bitsnelheid (niet CBR of constante bitsnelheid), hoogste kwaliteit
  3. Max bitrate-600kbps
  4. Audio-codec-AAC
  5. Audio-indeling-44,1 kHz
  6. Audio-bitrate-64kbps
  7. FMS URL- "rtmp: // mijn-ip: 1935 / live"
  8. Stream Key- "mijn-stream-key"
  9. Resolutie-640x480
  10. FPS (frames per seconde) -30
  11. CFR (Constant Frame Rate) - Ja
  12. Keyframe-interval 2 seconden (één keyframe elke 2 seconden)
  13. x264 Codering Profile-baseline (werkt mogelijk met main — afhankelijk van gebruikte speler)
  14. x264 CPU Present-zeer snel

Ik raad aan om verschillende encoders te proberen en ermee te experimenteren. U wilt misschien een brede beeldverhouding - of uw camera (of andere uitzending) materialen kunnen dit eisen. Als dat zo is, zorg er dan voor dat je deze info in je encoder verandert en ook de aspectratio vermeld in het exec-ffmpeg-gedeelte van het nginx.confbestand dat ik heb aangeleverd; anders krijg je wat gekke videofeeds.

Zodra uw encoder is ingesteld, kunt u alles testen. Start de encoder op met je webcam of een soort testvoer dat erop draait. U kunt uw uitzending op dit punt bekijken met VLC-speler met behulp van URL's zoals:

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

Deze zijn respectievelijk voor uw hoofd- en uw mobiele videostreams. Vervang uw IP en streamsleutel dienovereenkomstig.

Nadat je je eerste stream hebt uitgezonden, controleer je (via ssh of ftp) of je live uitzending is opgenomen in de /video_recordingsmap op je Vultr VPS. Je kunt ook proberen dit opgenomen bestand in VLC af te spelen met een URL zoals:

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

Nginx-statistieken zijn ook beschikbaar (met Nginx stub_status). Om bezoekers- / kijkerstatistieken te bekijken, gaat u naar:

http://my-ip/stats

Om je video op een webpagina te bekijken, heb je een insluitbare speler nodig. Er zijn veel insluitbare spelers beschikbaar die HLS-video kunnen afspelen. Ik gebruik JW Player nu al een aantal jaren, maar de gratis versie zal HLS niet spelen. Flowplayer en Bitdash van Bitmovin (naast andere oplossingen) zijn genereus genoeg om gratis een niet-commerciële versie van hun spelers aan te bieden, waardoor je HLS-stream in een webpagina wordt ingebed. Voor dit artikel heb ik ze allebei geprobeerd en ik vond dat ze allebei redelijk goed werkten met mijn op Vultr / Nginx gebaseerde videoserver. Ik zal kort laten zien hoe ik Flowplayer aan de gang kreeg met mijn testbedmachine.

Als je live HLS-streaming op een regelmatige, duurzame of commerciële manier gaat gebruiken, raad ik je aan om een ​​licentie te kopen van Flowplayer of welke speler je ook besluit te gebruiken. U krijgt een speler met minder beperkingen, meer functies en een merknaam voor uw organisatie. Je krijgt ook ondersteuning - wat erg belangrijk kan zijn. Anders dan de Vultr VPS, zijn dit echt de enige kosten die aan het project zijn verbonden.

Voordat u iets anders doet, is het belangrijk om te zorgen voor zogenaamde "domeinoverschrijdende" beperkingen, die anders uw vermogen om naar een webpagina / website te streamen zouden uitschakelen. Maak een crossdomain.xmlbestand in uw nginx/htmlmap en plaats instructies daarin om gegevens tussen domeinen te laten stromen:

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

Kopieer eerst (vanaf deze pagina) en plak (klik met de rechtermuisknop) in het nano-editorveld de volgende XML-gegevens:

<?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>

Druk op Ctrl + O om weg te schrijven en vervolgens op Ctrl + X om het bestand op schijf op te slaan en af ​​te sluiten.

Ik pakte de HTML5 (versie 6.0.3) van Flowplayer die me een aantal bestanden en een map opleverde toen ik hem uitgepakt had. Ik heb alle bestanden en de map geüpload naar een submap van de Nginx / HTML-hoofdmap die ik "flowplayer" heb genoemd. Het exacte pad was /usr/local/nginx/html/flowplayer.

Om onze video te testen wanneer deze is ingesloten in een webpagina, maakt u een paar HTML-bestanden in de hoofdmap van de Nginx / HTML-map met behulp van nano en vult u deze in met de volgende inhoud.

Het dossier:

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

HTML code:

<!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>

Het dossier:

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

HTML code:

<!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>

Zorg ervoor dat u "mijn-ip" en "mijn-stroom-sleutel" vervangt door uw gegevens.

U moet het pad flowplayer/skin/functional.cssvoor het teken "#" in de stylesheet vervangen href="#". De tutorialsoftware ontdoet het pad. Je moet in een URL in te vullen src=""deel - het wordt uitgevoerd gestript door de tutorial software, het gebruik http://my-ip/live/my-stream-key/index.m3u8en http://my-ip/mobile/my-stream-key/index.m3u8, respectievelijk. Je moet ook scripttags srcin het hoofd toevoegen voor zowel jquery-1.11.2.min.jsals voor flowplayer.min.js. De tags worden verwijderd door de tutorialsoftware. Je kunt zien hoe je deze tags maakt door naar het example htmlbestand te kijken dat bij de Flowplayer-kit is geleverd.

Start de encoder op met je webcam of een soort testvoer dat erop draait. Je kunt je uitzending in een browser bekijken met de volgende URL's:

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

De eerste pagina toont eenvoudig al je streams - de belangrijkste en het mobiele platform. U kunt ze allebei opstarten en bekijken. Je zult merken dat de stream van het mobiele platform kleiner is. Deze stappen zijn bedoeld om ervoor te zorgen dat alles actief is.

De tweede pagina toont een enkele stream. Maar het is opgezet op een manier die "progressive streaming" wordt genoemd. Wat dit betekent is dat wanneer een kijker de video afspeelt, zowel de server als de speler proberen de kijker de stream met hoge bitsnelheid en hoge kwaliteit te geven als de kijkersverbinding deze kan ondersteunen. Als hun verbinding slecht is en de verbinding niet kan worden onderhouden, komt dit neer op het tonen van de (mobiele) stream met lagere bitsnelheid die 200 kbps lager is in bandbreedte. Als je zou willen, kun je meer gefaseerde, progressieve streams maken met ffmpeg en ze configureren met mijn voorbeeld.

Ik heb deze configuratie getest op een enkele kern, 1 GB Vultr VPS en ik ontdekte dat met een enkele livestream, plus de trans-rated mobiele stream die het creëert met ffmpeg, het cpu-gebruik minder dan 35% was en het slechts 100 MB had verbruikt mijn 1 GB RAM. Dat is een heel efficiënte setup.

Als u van plan bent om video te streamen die veel groter is in pixelafmetingen dan SD, zult u merken dat u een krachtigere VPS moet gebruiken. Ik was hier nieuwsgierig naar en voerde mijn hoofdstream uit tot 1280x960 pixels en 2 Mbps - wat de zaken extra belastte. Maar de VPS gebruikte nog steeds slechts 50% CPU en het geheugengebruik bleef op 100 MB. Ik heb een dozijn kijkers / browsers toegevoegd en het maakte bijna geen verschil in belasting op de VPS - alleen de gebruikte bandbreedte ging omhoog. Ik weet zeker dat het creëren van extra trans-rated streams met ffmpeg het systeem extra belast zou blijven houden.

Ik heb dit type server gebruikt in productieomgevingen met tussen de 50 en 100 gelijktijdige gebruikers en ontdekte dat het gebruik van hulpbronnen zeer weinig steeg met toenemende kijkerverbindingen. Experimenteer ermee. Maar ik denk dat de meeste gebruikers graag een single-core, 1GB VPS gebruiken. Geniet van je nieuwe HLS-streamingserver!



Leave a Comment

Kan AI vechten met toenemend aantal ransomware-aanvallen?

Kan AI vechten met toenemend aantal ransomware-aanvallen?

Ransomware-aanvallen nemen toe, maar kan AI helpen het nieuwste computervirus het hoofd te bieden? Is AI het antwoord? Lees hier weten is AI boezem of vloek

ReactOS: is dit de toekomst van Windows?

ReactOS: is dit de toekomst van Windows?

ReactOS, een open source en gratis besturingssysteem is hier met de nieuwste versie. Kan het voldoen aan de behoeften van moderne Windows-gebruikers en Microsoft uitschakelen? Laten we meer te weten komen over deze oude stijl, maar een nieuwere OS-ervaring.

Blijf verbonden via WhatsApp Desktop-app 24 * 7

Blijf verbonden via WhatsApp Desktop-app 24 * 7

WhatsApp heeft eindelijk de Desktop-app voor Mac- en Windows-gebruikers gelanceerd. Nu heb je eenvoudig toegang tot WhatsApp vanuit Windows of Mac. Beschikbaar voor Windows 8+ en Mac OS 10.9+

Hoe AI procesautomatisering naar een hoger niveau kan tillen?

Hoe AI procesautomatisering naar een hoger niveau kan tillen?

Lees dit om te weten hoe kunstmatige intelligentie populair wordt onder de kleinschalige bedrijven en hoe het de kansen vergroot om ze te laten groeien en hun concurrenten voorsprong te geven.

macOS Catalina 10.15.4 Supplement Update veroorzaakt meer problemen dan het oplost

macOS Catalina 10.15.4 Supplement Update veroorzaakt meer problemen dan het oplost

Onlangs heeft Apple macOS Catalina 10.15.4 uitgebracht, een aanvullende update om problemen op te lossen, maar het lijkt erop dat de update meer problemen veroorzaakt die ertoe leiden dat mac-machines worden gemetseld. Lees dit artikel voor meer informatie

13 Commerciële data-extractietools voor big data

13 Commerciële data-extractietools voor big data

13 Commerciële data-extractietools voor big data

Wat is een logboekbestandssysteem en hoe werkt het?

Wat is een logboekbestandssysteem en hoe werkt het?

Onze computer slaat alle gegevens op een georganiseerde manier op, het zogenaamde Journaling-bestandssysteem. Het is een efficiënte methode waarmee de computer bestanden kan zoeken en weergeven zodra u op zoeken drukt.https://wethegeek.com/?p=94116&preview=true

Technologische singulariteit: een verre toekomst van de menselijke beschaving?

Technologische singulariteit: een verre toekomst van de menselijke beschaving?

Naarmate de wetenschap zich snel ontwikkelt en veel van onze inspanningen overneemt, nemen ook de risico's toe om onszelf te onderwerpen aan een onverklaarbare singulariteit. Lees, wat singulariteit voor ons kan betekenen.

Een inzicht in 26 Big Data-analysetechnieken: deel 1

Een inzicht in 26 Big Data-analysetechnieken: deel 1

Een inzicht in 26 Big Data-analysetechnieken: deel 1

De impact van kunstmatige intelligentie in de gezondheidszorg 2021

De impact van kunstmatige intelligentie in de gezondheidszorg 2021

AI in de zorg heeft de afgelopen decennia grote sprongen gemaakt. De toekomst van AI in de gezondheidszorg groeit dus nog steeds met de dag.