Soluzione di streaming con Nginx
3.3 Modulo RTMP per Nginx
La creazione di moduli di terze parti è ovviamente incentivata e ne esistono diversi che implementano funzionalità utili in vari contesti. Uno di questi è lo RTMP-module, che aggiunge a Nginx funzionalità di streaming proprie di un media-server per live streaming RTMP, HLS o DASH. Il modulo consente di configurare un server RTMP che espone un endpoint per accettare connessio-ni da un encored client. L’encoder può essere un qualsiasi applicativo in grado di generare uno stream in formato FLV su RTMP, come ffmpeg, e supporta H.624 e AAC. Lavorando come segmenter, divide il flusso in frammenti che salva in file in formato opportuno a seconda del protocollo utilizzato (.ts per HLS) e che sono a questo punto risorse sul web-server Nginx. Inoltre genera la playlist che descrive lo stream.
Nella catena di streaming propria dei protocolli HTTP-based (nella quale sono previsti un Media encoder per la codifica del flusso, uno Stream seg-menter per la suddivisione in frammenti e la generazione delle playlist e un Distribution server per la pubblicazione di questi contenuti sul web) il mo-dulo RTMP agisce da segmenter: definisce un endpoint RTMP su Nginx per ricevere connessioni da qualsiasi client (es. ffmpeg) in grado di generare un stream codificato H.624 o AAC su RTMP, frammenta questo flusso gene-rando file che vengono pubblicati sul web-server e produce una playlist che descrive lo stream.
Oltre a consentire la pubblicazione di contenuti VOD (Video-On-Demand), per i quali tutti i frammenti dello stream sono disponibili sul server e la cui playlist non viene dunque modificata nel tempo, aderendo alle specifiche del
protocollo HLS il modulo supporta anche le modalità LIVE ed EVENT, en-trambe dedicate alla pubblicazione di contenuti la cui registrazione avviene mentre i client riproducono lo stream e che richiedono dunque non solo che nuovi frammenti vengano pubblicati periodicamente sul server, ma anche che la playlist venga aggiornata di conseguenza. Secondo tali specifiche, una playlist LIVE contiene l’elenco di un numero limitato di frammenti, quelli che ricadono in una finestra temporale di dimensione limitata e allineata alla coda dello stream: aggiornare una playlist di questo tipo vuol dire aggiungere in coda il nuovo frammento pubblicato e rimuovere dalla testa quello meno recente. Una playlist EVENT contiene invece l’elenco di tutti i frammenti pubblicati dall’inizio dello stream fino all’istante corrente, così che l’aggior-namento della playlist si traduce in un’operazione di append in coda alla lista.
3.3.1 Configurazione del modulo RTMP per lo stre-ming HLS
L’RTMP module è in realtà un complesso insieme di moduli che servono a diversi scopi. Esso interviene molto a fondo nella struttura modulare di Nginx, creando un nuovo tipo di contesto che può essere innestato all’interno del contesto main del file di configurazione. Si tratta del contesto rtmp, che definisce appunto un blocco in cui si possono creare dei server RTMP. Questi server comunicano utilizzando questo protocollo piuttosto che HTTP.
All’interno di un context server dichiarato nel contex rtmp si possono dichiarare delle application. Una application è un una location che imple-menta determinate funzionalità di streaming. L’application è un endpoint RTMP che può essere contattato da un media encoder. Il media encoder può utilizzare il base path associato all’application che vuole contattare e farlo seguire dal nome che desidera dare allo stream. L’application creerà una nuova playlist dedicata a quel particolare flusso in input, dando al manifest il nome fornito dal media encoder.
In una application è possibile abilitare l’utilizzo di un protocollo. Dato che tanto per DASH quanto per HLS sono definiti dei moduli dedicati, abilitare un protocollo di streaming piuttosto che un alto significa di fatto abilitare i corrispondenti moduli.
Per abilitare il modulo HLS si può utilizzare la direttiva hls on. All’in-terno del contesto della application si possono utilizzare tutte le direttive che il modulo offre e che riguardano HLS al fine di configurare il protocollo.
Le principali direttive offerte sono analizzate di seguito.
• hls_path. Indica la directory in cui si troveranno la playlist e i fragment.
• hls_fragment. Consente di specificare la durata per i frammenti HLS.
• hls_playlist_length. Consente di specificare la lunghezza complessiva della playlist.
• hls_type. Indica di che tipo debba essere la playlist creata dal modulo, LIVE o EVENT.
• hls_variant. Consente di specificare un suffisso per i diversi variant stream che possono arrivare dal media encoder. Se l’aplication riceve diversi stream in input con lo stesso nome seguito da diversi suffissi, verifica se questi suffissi corrispondono a qualcuno di quelli dichiarati assieme a questa direttiva. In questo caso considera quegli stream come un variant di uno stesso stream avente come nome la porzione di nome comune a tutti i flussi.
• hls_keys, hls_key_path, hls_key_url, hls_fragments_per_key. Con-sentono di abilitare e gestire l’utilizzo di chiavi di cifratura per cifrare i frammenti.
Per completare la configurazione è necessario creare una location sul server HTTP che consenta l’accesso ai fragment. Per farlo è sufficiente creare una comune location e associare ad essa la gestione dei file nella directory in cui il modulo inserisce i frammenti e la playlist. Il classico meccanismo di handling di richieste HTTP per file statici messo in atto da Nginx farà il resto.
In figura 3.8 è mostrato un esempio di file di configurazione per abilitare il supporto ad HLS in Nginx.
3.3.2 Supporto ad altri protocolli
Il modulo consente di eseguire una configurazione analoga per abilitare il supporto a DASH. Data la natura estremamente simile dei due protocolli, le direttive disponibili nel modulo DASH sono sostanzialmente le stesse di-sponibili in quello HLS, con la variante del richiamo al nome del protocollo corretto.
worker_processes auto;
http {
server {
listen 80;
location /hls { types {
application/vnd.apple.mpegurl m3u8;
}
root /tmp;
} } } rtmp {
server {
listen 1935;
application tv { live on;
hls on;
hls_path /tmp/hls;
hls_fragment 10s;
} } }
Figura 3.8. File di configurazione di Nginx con supporto ad HLS tramite l’RTMP-module [5]