CREARE UN PROPRIO SERVER PER IL VIDEO STREAMING

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.


Video Guida

50 Comments to “CREARE UN PROPRIO SERVER PER IL VIDEO STREAMING”

  1. 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

    1. 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

  2. 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.

    1. dimenticavo! il mio pc è un laptop connesso ad internet tramite wifi.

    2. 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.

      1. 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)

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

    1. Grazie a te e buona visione.

      1. 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

        1. si connette, su vlc vedo che parte il timer, ma non visualizza il video…

          1. 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

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

    1. 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/

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

      2. 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.

  5. 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

    1. 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.

  6. Grazie del supporto, funziona.

  7. Ciao Francesco interessante guida ma come faccio se invece compro un server magari su aruba? Dopo aver inatallato il tutto come lo raggiungo?

    1. 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.

      1. 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

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

  9. 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

    1. 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

    2. 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.

  10. 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

    1. 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.

  11. 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

    1. 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

  12. 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

  13. 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….

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

    1. 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,

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

  16. 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

  17. 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.

    1. 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.

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

    1. 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

  19. Buonasera ma putty non gira su mac?

    1. 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

  20. 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

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

    1. 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.

      1. Eccomi per un aggiornamento. non è necessario fare nulla. NGINX trasporta già di suo ogni streamkey che riceve anche simultaneamente! RISOLTO. Grazie ancora Francesco!

        1. Ottimo! Grazie a te.

        2. Ciao Marco, volevo sapere come hai fatto a far distribuire più flussi su NGINX?

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

  23. 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.

    1. 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *