Durante una manifestazione organizzata nel mio Istituto è nata l’esigenza di fare uno streaming che trasmettesse le immagini video delle riprese fatte da un drone. Poiché il collegamento ad Internet dell’Istituto non era molto performante, rendendo così impossibile indirizzare una live verso facebook, youtube o altri server, ho deciso di creare un server in grado di gestire il protocollo RTMP (Real Time Messaging Protocol) che permettesse lo streaming in locale.
Di seguito la soluzione e gli strumenti utilizzati:
La prima scelta è stata quella di utilizzare Virtualbox (un software di virtualizzazione in grado di creare delle macchine virtuali sulle quali far girare il sistema operativo che preferiamo).
Per installare Virtualbox è sufficiente fare il download dell’applicazione dal sito https://www.virtualbox.org/ e procedere all’installazione.
Dopo aver installato Virtualbox, ho scaricato una iso di ubuntu server dal sito https://www.ubuntu-it.org/ .
A questo punto ho avviato virtualbox e dopo aver cliccato sul pulsante “Nuova”, ho proceduto alla creazione di una macchina in cui girasse il server linux ubuntu.
Come impostazioni della scheda di rete virtuale del server ho utilizzato quelle mostrate dall’immagine che segue. Inoltre ho assegnato alla scheda di rete, durante l’installazione di ubuntu, ma lo si può fare anche dopo, un ip statico appartenente alla mia sottorere (nel mio caso 192.168.1.233).
Avviata la macchina virtuale, dopo essermi autenticato, ho proceduto all’installazione del server web Nginx e delle librerie necessarie per supportare il protocollo RTMP, di seguito i comandi utilizzati:
sudo apt update
(comando per aggiornare la lista dei pacchetti disponibili nei repository elencati nel file /etc/apt/sources.list)
sudo apt install nginx
(comando per installare il web server Nginx)
sudo add-apt-repository universe
(comando per aggiungere al file /etc/apt/sources.list i repositories universe in cui si trovano pacchetti necessari per il nostro scopo)
sudo apt update
(aggiorniamo ancora la lista dei pacchetti)
sudo apt install libnginx-mod-rtmp
(installiamo la libreria che contiene il modulo per gestire il protocollo rtmp)
Procediamo ora a configurare adeguatamente il nostro server, quindi editiamo, utilizzando un editor a nostra scelta (io ho usato nano) , il file di configurazione di Nginx mediante il comando
sudo nano /etc/nginx/nginx.conf
Posizioniamoci alla fine del file e aggiungiamo le righe seguenti:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
}
}
}
Prestare Particolare attenzione alla riga application live, perché live farà parte dell’URL associata allo streaming.
Riavviare ora il server Nginx, affinché possa riconoscere i cambiamenti di configurazione fatti, utilizzando il comando seguente:
sudo systemctl restart nginx
A questo punto il nostro server è in grado di accettare lo streaming, ma ora ci serve un software di streaming, io ho scelto OBS (Open Broadcast Studio), potete scaricarlo a questo indirizzo https://obsproject.com/.
Avviamolo e clicchiamo in basso a destra su impostazioni, poi sulla nuova finestra clicchiamo su Dirette, il pulsante si trova nella parte sinistra, a questo punto nella pagina centrale effettuiamo le scelte seguenti:
Servizio: Personalizzato
Server: rtmp://192.168.1.233/live ( al posto di 192.168.1.233 occorre inserire l’ip che ciascuno di noi ha assegnato al server ubuntu )
Codice delle dirette: quello che si desidera, per esempio francesco
Confermiamo il tutto, prepariamo con obs la nostra diretta e avviamola.
Ora per vedere la diretta, da qualunque postazione in rete, è sufficiente avviare il lettore multimediale VLC, che è possibile scaricare da https://www.videolan.org/, cliccare su Media>apri flusso di rete e digitare l’url rtmp://indirizzo_server_installato/live/codice_diretta , nel mio caso rtmp://192.168.1.233/live/francesco
Lo streaming a questo punto sarà fruibile dalla nostra rete locale.
Ottima Guida! Se cerchi dei server professionali per aumentare i tuoi ascoltatori in contemporanea con banda dedicata puoi trovare un server video professionale su https://azotosolutions.com
Signor Francesco buongiorno mi presento mi chiamo Franco D’Angelo e sono di Sulmona provincia dell’Aquila Abruzzo Ho eseguito tutto il procedimento per quando concerne la realizzazione della hosting server video e funziona benissimo a livello pubblico perché ho un indirizzo pubblico ma la domanda che io vorrei porle se io al posto del protocollo rtmp vorrei un protocollo http per generare un flusso per il mio sito web cosa devo fare
Buonasera,
sto tentando di metter su un server video e, durante la mia cerca, ho trovato il suo tutorial.
L’ho eseguito tutto, passo passo, fino a lanciare putty che purtroppo riporta “connection refused”.
Ho provato il ping dalla macchina virtuale, ma l’indirizzo che pingo è unreachable. nel dettaglio, io pingo il 192.168.1.0.
L’ ipv4 impostato sulla virtuale è 192.168.1.105, la subnet mask è 255.255.255.0.
Quando li ho impostati nella macchina virtuale, ho inserito gli stessi valori del pc su cui lancio virtualbox.
Cosa ho sbagliato? Può aiutarmi per favore?
Grazie.
dimenticavo! il mio pc è un laptop connesso ad internet tramite wifi.
Hai settato la scheda di rete della macchina virtuale come scheda con bridge?
Inoltre, non puoi pingare il 192.168.1.0 perchè non può essere l’indirizzo di una macchina, ma indica la sottorete.
Prova dal pc a pingare la macchina virtuale ping 192.168.1.105.
Nell’articolo davo per scontato che sulla macchina server fosse già installato il server openssh, senza di questo putty non si collega.
Controlla queste cose, se non hai installato openssh e hai difficoltà fammelo sapere che ti do indicazioni su come fare.
A presto.
Ciao e grazie 1000 della disponibilità!!!
Invio informazioni più precise:
Macchina HOST:
IP 192.168.1.105
SUBNET MASK 255.255.255.0
DEFAULT GATEWAY 192.168.1.1
Macchina VIRTUALE:
INET 192.168.1.105/24 BRD 192.68.1.255
DALLA VIRTUALE:
ping 192.168.1.105 funziona correttamente
ping 192.168.1.1 unreachable
DALLA HOST:
OpenSSH installato (da manage optional features)
putty: “network error: connection refused” sia per 192.168.1.1 sia per 192.168.1.105 (porta 22)
rileggendo, mi sono accorta che avevo assegnato lo stesso ip della host alla virtuale!!!
Grazie ancora per la disponibilità! Procedo con il resto del video!
Grazie a te e buona visione.
sto tentando di connettermi al serve tramite la camera di un drone inserendo rtmp://192.168.1.233/live/francesco, ma non si connette, perché?
Grazie
si connette, su vlc vedo che parte il timer, ma non visualizza il video…
Ho pochi elementi su come hai configurato il tutto, per darti una risposta esaustiva. Quello che posso assicurarti è che il server funziona, infatti lo uso spesso per vedere le partite streammando sul server creato con obs e poi usando vlc sulla mia TV, richiamando l’indirizzo rtmp://192.168.1.233/live/francesco.
Controlla le varie configurazioni, soprattutto gli indirizzi assegnati e inoltre che non ci sia qualche firewall che ti crei il problema.
Grazie per la lettura
Buonasera Francesco e complimenti per la chiarezza con cui hai spiegato tutto.
Se volessi pubblicare il server, ossia riuscire a vedere lo streaming prodotto da una videocamera al di fuori della mia rete, quali sarebbero i passi da percorrere?
Per rendere visibile il server che hai creato all’esterno, una soluzione sarebbe possedere un ip statico e configurare sul tuo router un NAT che quando riceve una richiesta dall’esterno sul tuo ip e sulla porta in cui il tuo server è in ascolto (tipicamente la 1935), la trasli all’ip della tua LAN assegnato al server (questo tipo di NAT viene detto DNAT destination nat).
Un’altra possibilità molto semplice, per rendere il tuo server accessibile dall’esterno, è quella di creare un tunnel tra la tua rete e Internet, un programma utile che fa questo, scaricabile gratuitamente, si chiama ngrok e lo trovi qui:
https://ngrok.com/
usando ngrok, ottengo un forwarding address del tipo https://xxxxxxx.ngrok.io
per vedere la diretta, usando i parametri definiti nel tutorial, digito nel browser https://xxxxxxx.ngrok.io/live/fchiriaco ma ottengo “502 Bad Gateway
The server returned an invalid or incomplete response”. Cosa mi sono perso?
Buongiorno Francesco.
Ho installato ngrok e l’ho lanciato sulla 1935 che è la porta specificata in nginx.conf per live.
Mi vengono restituiti due forwarding http://abcdefgh.ngrok.io e https://abcdefgh.ngrok.io.
Apro OBS e, in settings, nel tab Stream, imposto Server=https://abcdefgh.ngrok.io/live e key=lkjhgf.
quando lancio “start streaming”, il tentativo di connessione fallisce: “make sure you’ve configured a valid streaming service and no firewall is blocking the connection”. Hai qualche suggerimento?
Grazie.
se lancio ngrok sulla 80, inserendo il forwarding nel browser, riesco a connettermi alla pagina nginx con successo, ma obs continua a dare loo stesso errore.
ti allego il dettaglio del netstat:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:1935 0.0.0.0:* LISTEN 2171/nginx: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2171/nginx: master
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 620/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 713/sshd
tcp 0 0 127.0.0.1:4040 0.0.0.0:* LISTEN 3198/ngrok
tcp6 0 0 :::80 :::* LISTEN 2171/nginx: master
tcp6 0 0 :::22 :::* LISTEN 713/sshd
udp 0 0 127.0.0.53:53 0.0.0.0:* 620/systemd-resolve
Ciao, cerco di spiegarti i passi che devi fare con ngrok.
Innanzitutto devi installare ngrok sul server linux dove gira nginx.
Poi vai col browser sulla pagina di ngrok e in alto a destra registrati (gratuitamente), ti serve perché devi usare un comando che abilita una porta diversa da http.
Una volta che hai creato l’account, nella tua dashboard ci sono dei riquadri, in particolare ti serve quello dell’authtoken, copia la riga senza il punto iniziale e lo slash e digita il comando seguente:
ngrok authtoken 152536fdfsdfsfs (ovviamente i caratteri che seguono authtoken nel tuo caso saranno diversi in quanto collegati al tuo account, io ho usato caratteri inventati).
Su OBS lascia la configurazione invariata ad esempio:
rtmp://192.168.1.233/live e con codice diretta ad esempio francesco
Adesso lancia sul server linux il comando seguente:
ngrok tpc 1935
Ti comparirà un indirizzo tipo:
tcp://0.tcp.ngrok.io:18808
Apri vlc e nel flusso di rete
scrivi l’indirizzo che ti è comparso cambiando il protocollo tcp in rtmp e aggiungendo alla fine live/francesco o altro se nel tuo caso hai usato un altro codice diretta…esempio di indirizzo:
rtmp://0.tcp.ngrok.io:18808/live/francesco
Ricordati di cambiare nella stringa che ti ha restituito ngrok il protocollo tcp in rtmp.
Fammi sapere se funziona.
Grazie del supporto, funziona.
Ciao Francesco interessante guida ma come faccio se invece compro un server magari su aruba? Dopo aver inatallato il tutto come lo raggiungo?
Ciao Grazie. Se acquisti un hosting non puoi fare niente, in quanto non hai la possibilità di cambiare la configurazione del server in maniera così netta, se invece acquisti la gestione completa di un server tipo un housing o altre modalità che ti danno la possibilità di gestirlo totalmente, allora dovresti seguire gli stessi passaggi della guida con l’ulteriore vantaggio di avere un ip pubblico e/o un nome di dominio associato. Ovviamente la seconda soluzione è molto costosa.
Lo potrei prendere su contabo. Solo che vorrei aver possibilità di farmi una chiacchierata con te perchè vorrei spiefarti il mio problema. Ti lascio la mia mail se magari vuoi contattarmi anche in giornata dato che siamo in quarantena forzata vista l emergenza. Frcatania@gmail.com
mi chiedevo se una persona volesse usare una pagina google al posto di OBS come una sorta di web chiamata o trovato tanti argomenti ma in swf a me servirebbe javascript & html5, qualche idea ?
Ciao Francesco.. ho letto e seguito tutta la tua guida.. sei stati chiarissimo.. una sola domanda:
– Se io avessi bisogno di un flusso rtsp basta è sufficiente sostituire rtmp con rtsp?
In poche parole uso un programma per ipad e potrei aggiungere un flusso video in rtsp.. vorrei inviarglielo tramite mac.. e sto impazzendo per riuscirci
Grazie
l’app dell’ipad (live:air action) puo anche utilizzasre come stream protoco MPEG-TS nelle varianti UDP ,TCP, TCP,Pull, il problema che mi sto creando è riuscire attraverso obs mandare un flusso all’ipaf
Scusa il ritardo, ma è un periodo un po’ particolare e molto impegnativo per me.
Con la procedura che ho descritto non credo, non so se hai provato a farlo.
Ciao Francesco, complimenti per la spiegazione.. ho una domanda: Vorrei usare questo tuo procedimento per poter sfruttare il flusso video e utilizzarlo con un app per dei live su un iPad (situato nella stessa rete).
L’app si chiama live:air Action, e mi richiede un flusso RTSP e non RTMP (con i protocollo UDC o TCP o HTTP), oppure un flusso MPEG-TS (con i protocolli UDP, TCP o TCP-Pull), come potrei sfruttare il tutto in modo da poter tramite OBD inviare questo flusso?
Spero essere stato chiaro.
Grazie,
Ruben
Grazie, Io mi sono appoggiato ad un server nginx che supporta RTMP mediante l’installazione della libreria libnginx-mod-rtmp, dovresti vedere se esiste una libreria per RTSP. Se esiste non sarebbe un problema, basterebbe seguire la stessa procedura.
Ciao francesco,
Scusa la domanda ignorante ma da che tipo di computer fisico sei partito per realizzare questo progetto? Con un Windows 10pro e virtualizzando tutto il tuo processo, riuscirei a realizzare il tuo progetto? La linea internet che ho è una fibra Fastweb
Va benissimo anche io ho seguito questo percorso windows 10 pro, il sever invece è una macchina linux Ubuntu server virtualizzata su Virtualbox. Penso che con la tua fibra non avrai problemi
Ciao, complimenti per la guida; vorrei realizzare un server per mettere on line il flusso live di una webcam; sarei orientato sul noleggio di un server virtuale, sapresti consigliarmi che caratteristiche minime hardware dovrebbe avere la macchina virtuale per far girare ubuntu+nginx? ci sono diverse configurazioni ma non saprei quale scegliere tra queste… https://www.cloud.it/vps/vps-hosting.aspx
Grazie Mille ottima guida , funziona tutto alla perfezione, compreso ngrok per uscire all’esterno, seguendo le tue impostazioni, chiaramente bisogna lasciarlo in esecuzione su putty altrimenti chiude la connessione , mi stavo chiedendo se su obs con la funzione browser si possa ricevere un flusso rtmp….
salve volevo un informazione , ma in questo modo se io voglio fare vedere la mia diretta, da altri utenti che non si trovano collegati alla mia rete si può fare?
Se hai un ip fisso è comodissimo, ti basta settare nel router un nat alla porta 1935.
Se non hai un ip fisso ngrok può aiutarti. Se leggi i commenti precedenti trovi come fare con ngrok,
Ottima Guida Francesco.
Ascolta sulla stessa macchina Ubuntu è possibile aggiungere un player in modo che dalla stessa (magari una VPS) è possibile collegarcisi e visualizzare il flusso magari in HLS ???
Buongiorno Francesco,
e complimenti per il lavoro svolto, davvero efficace. Chiedevo se conosce un lettore rtmp, da poter utilizzare in un una pagina web, che leggesse il flusso generato, un client diciamo.
Ho attivato il tunnel con ngrok che funziona alla grande, e non vorrei utilizzare vlc ne i suoi plug in. Non riesco a trovare niente se non per hls, può aiutarmi? Grazie.
Saluti.
Nicola
Ciao Francesco, grazie al tuo tutorial sono riuscito a configurare nginx però su un server AWS con win2019.
Volevo sottoporti il mio problema:
ho una connessione FTTC con Fastweb con 100Mb/s in download e 20Mb/s in upload
il server ha una connessione da 200Mb/s in down e circa 600Mb/s in up.
Se provo ad inviare un flusso dati da 16M da una videocamera verso il server (entro i 20Mb/s della mia Fastweb) tutto funziona… Appena provo a verificare lo streaming da un altro pc della mia rete dal server in download mi arriva un flusso di appena 3/4Mb/s.
Ho provato a fare push dal server a YouTube e li se strino a 16 su YouTube lui restreamma a 16…
Probabilmente mi perdo qualcosa io…
ho pensato: o Fastweb mi limita rump in download o non ho capito io come funzionano le reti internet.
Oppure qualcosa su nginx che boh?!!?
anche provando sulla mia lan interna al massimo, per poter vedere lo streaming devo stremare al massimo a 30Mb/s..
Grazie per qualsiasi aiuto e/o suggerimento potrai darmi.
Antonio.
Grazie per il commento. Leggendo il tuo problema penso che non sia un problema di nginx. Mi sembra più una limitazione della tua rete e di Fastweb. Non credo però di avere la soluzione al tuo problema.
Ciao, io utilizzo OBS per inviare uno streaming tramite youtube. Il PC non mi dà problemi, l’unico problema è dato dalla connessione che spesso ha degli sbalzi.
Secondo te potrei inviare lo stream primario tramite un router e lo stream di backup con un altro?
Per suddividere il carico potrei usare lato hardware un load balancer oppure lato software settare le static route così da indirizzare sulla LAN1 il primario e sulla LAN2 quello di backup (ho 2 schede ethernet sul pc).
L’importante è utilizzare un solo PC… ho una sola telecamera e una sola periferica di acquisizione USB, inoltre durante la diretta aggiungo anche delle scritte in sovraimpressione, per cui non potrei utilizzare 2 PC.
Grazie, a presto!
Ciao, anche se non ho mai fatto una cosa del genere, penso che l’idea del load balancing dia più garanzie rispetto ad un routing statico, per quanto riguarda la stabilità di rete, penso che tu possa migliorare le prestazioni disattivando il DHCP ed installando un dns di sola cache, questi due accorgimenti diminuiranno il traffico in rete.
Questo link suggerisce anche una soluzione alternativa, ma ci sono dei costi https://techboom.it/unire-due-connessioni-broadband-in-una-rete-domestica/
Ciao
Buonasera ma putty non gira su mac?
Su windows putty serve per stabilire una connessione SSH, su linux c’è il client SSH e su MAC c’è l’applicazione terminale che è equivalente. Questo link può esserti utile.
https://www.mrw.it/apple/connessione-ssh-mac-os_12975.html
Buonasera, ottima guida grazie. Posso usare NGINX per ricevere più flussi da diverse fonti ? La mia ipotesi è installare NGINX su un server linux e gestirlo per una decina di flussi diversi.
grazie
Buon pomeriggio Francesco e grazie per il tutorial, chiaro, lineare e ottimamente supportato dal testuale sul sito. Tant’è che in poco sono riuscito a mettere su il servizio.
Avrei necessità di “distribuire” 3 diversi flussi in contemporanea. Ho pensato di replicare tre volte l’installazioni con tre virtualizzazioni parallele ma onestamente mi sembra uno spreco di risorse HW.
Vorrei sapere se sullo stesso NGINX posso far distribuire più di un live in contemporanea differenziando il nome e replicando 3 volte il segmento del NGINX.conf relativo al nome. Che dici potrebbe funzionare? Hai qualche indicazione sulla sintassi? GRAZIE!!!
Ti ringrazio per il feedback e provo a risponderti. La tua idea per le repliche potrebbe funzionare. Ma provo a suggerirti un’altra strada che io non ho provato, ma che secondo me potrebbe funzionare.
Invece di usare le macchine virtuali, potresti usare i container con Docker, quindi costruirti un’immagine con Nginx e le librerie necessarie e poi da questa immagine creare tre container che sulla macchina host rispondano a tre diverse porte.
Un ulteriore vantaggio di usare docker invece di virtualbox è la sua portabilità. A me serviva un solo flusso e non ho sperimentato con docker, ma secondo me potrebbe risolvere il problema. Se funziona fammi sapere.
Eccomi per un aggiornamento. non è necessario fare nulla. NGINX trasporta già di suo ogni streamkey che riceve anche simultaneamente! RISOLTO. Grazie ancora Francesco!
Ottimo! Grazie a te.
Ciao Marco, volevo sapere come hai fatto a far distribuire più flussi su NGINX?
Salve ! Ma se ho comprato un dominio internet su Aruba.it posso creare un codice M3u8 per fare lo streaming e se si come faccio ?
Salve, ottimo tutorial ma ho una domanda da porre. Se io voglio inviare un flusso video al server ma da un dispositivo non nella stessa rete ma in UMTS (esempio un telefono che trasmette con app RTMP) come devo configurare il server per poi riceverlo su OBS? Grazie mille.
Ciao e grazie. Se ho ben compreso la domanda penso sia necessario intervenire sul router della tua rete (se hai un IP pubblico/statico), facendo un DNAT al server interno. Una volta configurato il router, sul tuo dispositivo devi inserire l’IP pubblico seguito dalla porta che hai assegnato ed il flusso verrà diretto alla macchina server interna.