Το HTTP Live Streaming (HLS) είναι ένα πολύ ισχυρό πρωτόκολλο βίντεο ροής που εφαρμόζεται από την Apple Inc. Το HLS χρησιμοποιεί συναλλαγές HTTP που διασχίζουν τείχη προστασίας, διακομιστή μεσολάβησης και μπορούν να διανεμηθούν μέσω CDN με ευκολία. Επομένως, αυτή η τεχνολογία είναι σε θέση να προσεγγίσει ένα πολύ μεγαλύτερο κοινό προβολής από το RTP ή άλλα πρωτόκολλα που βασίζονται σε UDP. Μεγάλο μέρος της ζωντανής ροής βίντεο στο διαδίκτυο σήμερα φιλοξενείται από ακριβά συστήματα που χρησιμοποιούν HLS, αλλά είναι γενικά ακριβά και απαιτούν πολλούς πόρους διακομιστή. Αυτό το σεμινάριο θα σας δείξει πώς να ρυθμίσετε ένα πολύ προσιτό Ubuntu 14.04 VULTR VPS για να πραγματοποιείτε εκδηλώσεις ζωντανής ροής HLS χρησιμοποιώντας μόνο λογισμικό ανοιχτού κώδικα.
Το πρώτο βήμα είναι να διαβάσετε και να ρυθμίσετε τον διακομιστή σας σύμφωνα με το Vultr Doc " Setup 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 (εγκατεστημένο στο προηγούμενο σεμινάριο) για τη δημιουργία της προσαρμοσμένης σε ρυθμό μετάδοσης bit, βελτιστοποιημένης για κινητά ροής 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 εδώ και μερικά χρόνια, χωρίς να χρησιμοποιώ τις οδηγίες "να επιτρέπεται δημοσίευση" και "άρνηση δημοσίευσης" και έχω δει μηδενικές περιπτώσεις ατόμων που χρησιμοποιούν/εισβάλλουν στους διακομιστές βίντεο μου. Επομένως, δεν συμπεριέλαβα αυτές τις οδηγίες εδώ. Διαβάστε και προσθέστε αυτές τις οδηγίες εάν θέλετε.
Αφού αλλάξετε το nginx.confαρχείο, πρέπει να επανεκκινήσετε το Nginx για να χρησιμοποιήσετε τη νέα διαμόρφωση:
sudo service nginx restart
Παρακολουθήστε προσεκτικά για τυχόν μηνύματα σφάλματος Nginx και αντιμετωπίστε τυχόν σφάλματα που μπορεί να έχουν προκληθεί από προβλήματα ορθογραφίας, ιδιοκτησίας φακέλου ή αδειών. Εάν δεν έχετε μηνύματα σφάλματος, τότε είστε έτοιμοι να δημιουργήσετε τη ροή κωδικοποίησης.
Πρέπει να έχετε έναν κωδικοποιητή βίντεο για να δημιουργήσετε τη ροή. Χρησιμοποιώ OBS (Λογισμικό Open Broadcaster) - το οποίο είναι ανοιχτού κώδικα και λειτουργεί καλά για μένα. Υπάρχουν και άλλες λύσεις από τις οποίες μπορείτε να επιλέξετε, οι οποίες βρίσκονται εκτός του πεδίου αυτού του σεμιναρίου. Δεν θα καλύψω τα πάντα σχετικά με τη διαμόρφωση ενός κωδικοποιητή βίντεο RTMP. Ωστόσο, όλα απαιτούν περίπου τις ίδιες μεταβλητές εισόδου. Οι βασικές ρυθμίσεις που θα χρειαστεί να εισαγάγετε για να χρησιμοποιήσετε την ακριβή μου nginx.confδιαμόρφωση και να λειτουργήσετε καλά στα περισσότερα προγράμματα αναπαραγωγής/προγράμματα περιήγησης/πλατφόρμες είναι οι εξής:
- Κωδικοποιητής-x264
- Μεταβλητός ρυθμός μετάδοσης bit (όχι CBR ή σταθερός ρυθμός μετάδοσης bit), υψηλότερη ποιότητα
- Μέγιστος ρυθμός bit-600 kbps
- Audio-Codec-AAC
- Μορφή ήχου-44,1 khz
- Ρυθμός bit ήχου-64 kbps
- URL FMS-"rtmp://my-ip:1935/live"
- Κλειδί ροής-"my-stream-key"
- Ανάλυση-640x480
- FPS (καρέ ανά δευτερόλεπτο)-30
- CFR (Σταθερός ρυθμός καρέ) - Ναι
- Διάστημα βασικών καρέ-2 δευτερόλεπτα (ένα βασικό καρέ κάθε 2 δευτερόλεπτα)
- x264 Κωδικοποίηση προφίλ-βασική γραμμή (μπορεί να λειτουργεί με το main—εξαρτάται από το πρόγραμμα αναπαραγωγής που χρησιμοποιείται)
- x264 CPU Παρούσα-πολύ γρήγορη
Συνιστώ να δοκιμάσετε διαφορετικούς κωδικοποιητές και να πειραματιστείτε μαζί τους. Μπορεί να επιθυμείτε μια ευρεία αναλογία εικόνας - ή το υλικό της κάμερας (ή άλλων εκπομπών) μπορεί να το απαιτεί. Εάν ναι, φροντίστε να αλλάξετε αυτές τις πληροφορίες στον κωδικοποιητή σας και επίσης την αναλογία διαστάσεων που αναφέρεται στην ενότητα exec-ffmpeg του nginx.confαρχείου που παρείχα. Διαφορετικά, θα έχετε κάποιες ανόητες ροές βίντεο.
Μόλις ρυθμιστεί ο κωδικοποιητής σας, μπορείτε να τα δοκιμάσετε όλα. Ξεκινήστε τον κωδικοποιητή με την κάμερα web ή κάποιο είδος δοκιμαστικής τροφοδοσίας που τρέχει σε αυτόν. Μπορείτε να δείτε τη μετάδοσή σας σε αυτό το σημείο με τη συσκευή αναπαραγωγής 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 τα ακόλουθα δεδομένα 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.
Ξεκινήστε τον κωδικοποιητή με την κάμερα web ή κάποιο είδος δοκιμαστικής τροφοδοσίας που τρέχει σε αυτόν. Μπορείτε να δείτε τη μετάδοσή σας σε ένα πρόγραμμα περιήγησης χρησιμοποιώντας τις ακόλουθες διευθύνσεις URL:
http://my-ip/hls.html
http://my-ip/hls_progressive.html
Η πρώτη σελίδα δείχνει απλώς κάθε ροή σας - την κύρια και την πλατφόρμα για κινητά. Θα μπορείτε να τα ξεκινήσετε και τα δύο και να τα δείτε. Θα παρατηρήσετε ότι η ροή της πλατφόρμας για κινητά είναι μικρότερη σε μέγεθος. Αυτά τα βήματα είναι απλώς για να βεβαιωθείτε ότι όλα λειτουργούν.
Η δεύτερη σελίδα δείχνει μια ενιαία ροή. Αλλά έχει στηθεί με έναν τρόπο που ονομάζεται "προοδευτική ροή". Αυτό σημαίνει ότι όταν ένας θεατής παίζει το βίντεο, τόσο ο διακομιστής όσο και το πρόγραμμα αναπαραγωγής προσπαθούν να δώσουν στον θεατή τη ροή υψηλής ταχύτητας bit και υψηλής ποιότητας, εάν η σύνδεση των θεατών μπορεί να τη διατηρήσει. Εάν η σύνδεσή τους είναι κακή και δεν μπορεί να διατηρήσει τη σύνδεση, μεταβαίνει προς τα κάτω για να εμφανίσει τη ροή χαμηλότερου bitrate (κινητό) που είναι 200 kbps χαμηλότερο σε εύρος ζώνης. Εάν το επιθυμείτε, θα μπορούσατε να δημιουργήσετε πιο διαβαθμισμένες, προοδευτικές ροές με το ffmpeg και να τις διαμορφώσετε χρησιμοποιώντας το παράδειγμά μου.
Δοκίμασα αυτήν τη διαμόρφωση σε έναν πυρήνα, 1 GB Vultr VPS και διαπίστωσα ότι με μία μόνο ζωντανή ροή, συν τη ροή κινητής τηλεφωνίας με trans-rated που δημιουργεί με το ffmpeg, η χρήση της CPU ήταν μικρότερη από 35% και είχε καταναλώσει μόνο 100 MB το 1 GB της ram μου. Τώρα αυτό είναι μια πολύ αποτελεσματική ρύθμιση.
Εάν σκοπεύετε να κάνετε ροή βίντεο που είναι πολύ μεγαλύτερο σε διαστάσεις pixel από το SD, μπορεί να διαπιστώσετε ότι πρέπει να χρησιμοποιήσετε ένα πιο ισχυρό VPS. Ήμουν περίεργος για αυτό και έτρεξα την κύρια ροή μου έως και 1280x960 pixel και 2Mbps - επιβαρύνοντας επιπλέον τα πράγματα. Αλλά το VPS εξακολουθούσε να χρησιμοποιεί μόνο 50% CPU και η χρήση μνήμης παρέμεινε στα 100 MB. Πρόσθεσα μια ντουζίνα θεατές/προγράμματα περιήγησης και δεν είχε σχεδόν καμία διαφορά στο φόρτο στο VPS—μόνο το εύρος ζώνης που χρησιμοποιήθηκε αυξήθηκε. Είμαι βέβαιος ότι η δημιουργία πρόσθετων ροών μεταφρασμένης αξιολόγησης με το ffmpeg θα συνεχίσει να επιβαρύνει επιπλέον το σύστημα.
Έχω χρησιμοποιήσει αυτόν τον τύπο διακομιστή σε περιβάλλοντα παραγωγής με μεταξύ 50 και 100 ταυτόχρονους χρήστες και διαπίστωσα ότι η χρήση των πόρων αυξήθηκε πολύ λίγο με την αύξηση των συνδέσεων θεατών. Πειραματιστείτε με αυτό. Αλλά νομίζω ότι οι περισσότεροι χρήστες θα ήταν ευχαριστημένοι χρησιμοποιώντας ένα μονοπύρηνο VPS 1 GB. Απολαύστε τον νέο σας διακομιστή ροής HLS!