Come trasmettere video in diretta da un server Linux?


30

Ecco cosa voglio fare. Si guardò intorno ma non trovò alcuna risposta diretta. Ho una scatola Linux che esegue siti Web usando Ubuntu / MySQL / Apache. Ho anche il mio IP statico, ovvero non utilizzo l'hosting web. Vorrei poter trasmettere in streaming il feed video da una webcam su un laptop (presumibilmente con Windows) al mio server Linux e avere gli utenti di uno dei miei siti Web in grado di vedere quel video in diretta mentre viene trasmesso in streaming. Ovviamente il laptop avrebbe bisogno di autenticarsi con il server in qualche modo, ma non ci dovrebbero essere restrizioni su chi potrebbe vedere il video dal vivo sul sito web. Grazie.


chiedete come implementare tale soluzione o cercate una soluzione di terze parti pronta per l'uso? nel primo caso SO è il posto sbagliato per questa domanda, credo che sia la ragione del downvoting

Risposte:


46

Attualmente sviluppo streaming online da 3 telecamere miniDV collegate tramite FireWire, che è abbastanza simile alle tue esigenze.

Suggerimento rapido: vlc + flowplayer / jw player

Innanzitutto, esistono due formati video che è possibile utilizzare nello streaming online: FLV e h264. FLV è più facile da transcodificare, h264 ha un rapporto dimensioni / qualità migliore ma la transcodifica richiede molto più CPU. Entrambi possono essere visualizzati da Flash Player nella pagina Web.

In secondo luogo, l'infrastruttura di streaming. Dal momento che la tua larghezza di banda dal laptop è limitata (un paio di top Mbps) devi ottenere lo streaming sul tuo server e riprodurlo nuovamente sui client. Quindi il flusso scorrerà 1 volta al server e quindi N volte ai client da lì. Non hai descritto la tua connessione Internet per il tuo laptop, quindi lo scenario è diviso in due sezioni:

  1. Il laptop è collegato con un indirizzo IP pubblico OPPURE puoi portare la porta NAT sul laptop . Questo scenario è molto più semplice, dal momento che è possibile connettersi dal server al laptop in modo facile e semplice. Il grande svantaggio è che sei legato a una posizione (un indirizzo IP).

  2. Il laptop non è collegato con un indirizzo I pubblico . Questo è un po 'complicato, ma funzionerà da qualsiasi rete che ti permetterà di SSH sul tuo server e avrà un caricamento sufficiente (1 Mbps dovrebbe farlo).

Indipendentemente dallo scenario utilizzato, l'infrastruttura apparirà così

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

Streaming da laptop

  1. Cattura video dalla webcam . Non ho mai catturato streaming da webcam collegate localmente, ma ci sono molti esempi su come farlo tramite V4L, ad esempio: Impostazione webcam . L'unica parte a cui dovresti essere interessato è:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    Qual è la prima parte del comando VLC per connettersi alla webcam. Per maggiori dettagli segui il menzionato HOWTO. Guarda in particolare la parte "gruppo video" e il percorso corretto del dispositivo verso / dev / video e / dev / audio. Questi possono essere diversi sul tuo laptop.

  2. Transcodifica video in FLV . Personalmente uso FLV, poiché richiede meno CPU. La stringa di transcodifica che utilizzo è questa:

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    Che transcodificherà lo streaming video in formato FLV con audio MPGA (MP3 non è disponibile nel mio Ubuntu). Il campionamento è in qualche modo obbligatorio, senza di esso non funzionerà. Ma puoi scegliere più piccoli, come 22050. Questo transcodificherà il flusso video "così com'è", quindi la scala è 1: 1. È possibile aggiungere parametri di larghezza e altezza o persino parametri di scala. Guarda nella documentazione VLC.

  3. Streaming dal laptop . Ora devi creare un flusso locale, su cui si connetterà il server:

    :std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}

    Ciò vincolerà il flusso VLC a 0.0.0.0:8081/stream.flv. L'intero comando sarà simile al seguente:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'

Riavvio sul server

  1. Cattura stream sul server e ripristinalo . Ancora una volta, utilizziamo VLC per acquisire e riprodurre in streaming. L'utilizzo si basa sullo scenario di infrastruttura dall'inizio di questo post. Come ho mostrato, VLC su laptop trasmette video in streaming su alcune porte. Questa porta deve essere accessibile dal server. Se si dispone di un indirizzo IP pubblico di laptop o porta NATed, è possibile testarlo con telnet:

    server$ telnet public_ip_address 8081

    Tutto ciò che non sia "timeout di connessione" rivelerà che è possibile connettersi al flusso del laptop. Se non si dispone di un indirizzo IP pubblico o non è possibile eseguire la porta NAT, è necessario farlo al contrario. Puoi SSH da laptop a server e inoltrare in remoto la porta del tuo laptop al server. Il comando SSH corretto sarebbe:

    laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081

    Questo comando magico "vincolerà" la porta 8081 del laptop alla porta 8081 del server. Ciò significa che quando ci si collega al server 8081, si connetterà silenziosamente alla porta 8081 del laptop tramite il tunnel SSH. Bene, eh? :) Quindi tutto ciò che dobbiamo fare è connettere e trasmettere VLC:

    server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    O nel caso con indirizzo IP pubblico o porta NATed:

    server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'

    Come nella parte laptop, il VLC sul server è associato alla porta 8082. Perché 8082 e non 8081? 8081 è già preso dal forward forward di SSH. Perché non utilizziamo la parte transcodifica come nel primo esempio? Il video è già nel formato giusto, quindi tutto ciò che dobbiamo fare è semplicemente lo streaming così com'è.

  2. Test . In entrambi gli esempi, è possibile testare la funzionalità visualizzando i flussi tramite VLC. Puoi testare il tuo stream locale:

    laptop$ vlc http://localhost:8081/stream.flv

    E puoi testare il flusso del tuo server:

    laptop$ vlc http://server_ip_address:8082/stream.flv

    In entrambi i casi, dovresti vedere l'input della tua webcam.

Visualizza stream sul Web

La visualizzazione dello streaming sul Web, che funzionerà nella maggior parte dei casi, avviene tramite Flash Player. Ho provato due prodotti, gratuiti per uso non commerciale: JW Player e Flowplayer . Sono rimasto con Flowplayer, ma non ricordo il motivo, forse a causa dei plugin (che non uso :)) o della migliore documentazione.

Come visualizzare lo stream FLV da VLC nella pagina Web è spiegato qui: Stream VLC al sito Web con asf e Flash

Risoluzione dei problemi

Essere consapevoli di molti problemi che sorgeranno. Per prima cosa, come in tutto, leggi . VLC è un programma molto loquace, quindi ti dirà dove si trova il problema. Potrebbe essere un problema con le autorizzazioni per accedere al dispositivo audio / video, codec, errate --sout parametri mancanti, ... Imparare ad usare iftopper vedere se i flussi di dati in realtà attraverso di rete, etc.


1
Molte grazie! Questa era più informazione di quanto mi aspettassi. Controllerà VLC e utilizzerà le tue informazioni come guida.

3

Il mio strumento preferito qui sarebbe vlc . Non è solo un lettore video multiformato multiuso, è anche in grado di eseguire lo streaming in una grande quantità di formati di file e protocolli di streaming. Come bonus, funziona multipiattaforma tra host Windows e Linux.

Abbiamo creato qualcosa di simile un paio d'anni fa in cui un cliente che utilizzava una linea DSL a larghezza di banda ridotta (128 K a monte) aveva bisogno che le sue webcam connesse alla rete fossero trasmesse in streaming a un vasto pubblico. Un'installazione VLC come host "riflettore" eseguiva la rotazione del segnale della camma, prendeva il carico della larghezza di banda principale dai client di streaming e presentava il flusso in diversi protocolli e formati di streaming.


1

Non proprio la mia area di competenza, ma forse posso indicarti una potenziale direzione.

L'implementazione commerciale è di utilizzare Adobe Flash Media Server. Certo, quello può essere un approccio piuttosto costoso. Esistono tuttavia alternative open source, come Red5 . Dovrai installare il server (ha dipendenze Java).

Una volta che il server è in esecuzione, puoi scegliere il tuo front-end (credo che Red5 abbia alcuni esempi, ma puoi anche usare JW Player con type=camera).

Il front-end riceverà il video in streaming dal media server e caricherai il tuo stream sul media server.

Ulteriori informazioni: Guida e informazioni su Red5 e riferimento su Red5


jwplayer è una cosa fantastica per uso personale
Kendrick il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.