2010-01-14 14 views
5

Volevo avere alcune idee su come alcuni di voi avrebbero affrontato questo problema. Ho un robot, che esegue Linux e usa una webcam (con un driver v4l2) come uno dei suoi sensori. Ho scritto un pannello di controllo con gtkmm. Sia il server che il client sono scritti in C++. Il server è il robot, il client è il "pannello di controllo". L'analisi delle immagini sta accadendo sul robot, e mi piacerebbe per lo streaming indietro il video dalla telecamera al pannello di controllo per due motivi: A) per il divertimento B) per sovrapporre l'analisi delle immagini risultastreaming di video da e verso più fonti

Quindi la mia domanda è, quali sono alcuni buoni modi per trasmettere video dalla webcam al pannello di controllo e dare priorità al codice del robot per elaborarlo? Non mi interessa scrivere il mio schema di compressione video e metterlo attraverso la porta di rete esistente, una nuova porta di rete (dedicata ai dati video) sarebbe meglio che io pensi. La seconda parte del problema è come faccio a visualizzare i video in gtkmm? I dati video arrivano in modo asincrono e non ho il controllo su main() in gtkmm, quindi penso che sarebbe difficile.

Sono aperto all'utilizzo di cose come vlc, gstreamer o qualsiasi altra libreria di compressione generale che non conosco.

grazie!

MODIFICA: Il robot ha un processore da 1 GHz, con una versione desktop simile a Linux, ma senza X11.

+0

solo un pensiero: è possibile utilizzare una libreria vlc in un'applicazione utente per ottenere video in streaming VLC? In tal caso, potrei avere il flusso vlc e poi fare in modo che l'analisi delle immagini ottenga i dati video da una connessione loopback, e il pannello di controllo faccia lo stesso, ma da remoto. –

+1

non sono sicuro di vlc, ma ffserver è abbastanza facile da incorporare. –

+0

btw, vlc e ffserver sono entrambi basati su ffmpeg (libavcodec/ibavformat) –

risposta

1

Gstreamer risolve quasi tutto questo per te, con uno sforzo minimo, e si integra perfettamente con il sistema di eventi di Glib. GStreamer include plug-in di origine V4L, widget di output gtk +, vari filtri per ridimensionare/codificare/decodificare il video e, soprattutto, sink di rete e fonti per spostare i dati tra le macchine.

Per il prototipo, è possibile utilizzare lo strumento 'gst-launch' per assemblare le pipeline video e testarle, quindi è abbastanza semplice creare pipeline in modo programmatico nel codice. Cerca "streaming di rete GStreamer" per vedere esempi di persone che fanno questo con webcam e simili.

0

Non sono sicuro delle tecnologie effettive utilizzate, ma può essere una grande sincronizzazione ***** se si desidera evitare i fotogrammi persi. Stavo effettuando lo streaming di un video su un file e sulla rete contemporaneamente. Quello che alla fine ho fatto è stato usare un grande buffer circolare con tre puntatori: uno scrive e due leggi. C'erano tre fili di controllo (e alcuni fili codifica accessorie): una scrittura al buffer che pausa se ha raggiunto un punto nel buffer non letto da entrambi gli altri, e due fili lettori che letti dal buffer e scrivere il file/rete (e mettere in pausa se hanno anticipato il produttore). Dal momento che tutto è stato scritto e letto come frame, il sovraccarico della sincronizzazione potrebbe essere ridotto al minimo.

Il mio produttore era un transcodificatore (da un'altra fonte di file), ma nel tuo caso, potresti volere che la fotocamera produca fotogrammi interi in qualsiasi formato che normalmente fa e esegua solo la transcodifica (con qualcosa come ffmpeg) per il server , mentre il robot elabora l'immagine.

Il problema è un po 'più complesso, tuttavia, dal momento che il robot ha bisogno di feedback in tempo reale, quindi non può mettere in pausa e attendere che il server di streaming recuperi. Quindi potresti voler ottenere i frame nel sistema di controllo il più velocemente possibile e bufferarne alcuni in un buffer circolare separatamente per lo streaming sul "pannello di controllo". Alcuni codec gestiscono i fotogrammi persi meglio di altri, quindi se la rete rimane indietro puoi iniziare a sovrascrivere i frame alla fine del buffer (facendo attenzione che non vengano letti).

+0

Non mi dispiace lasciare i frame. L'elaborazione video non può comunque elaborarli tutti. –

0

Quando si dice 'una nuova porta video' e poi cominciare a parlare di vlc/gstreaming sto trovando difficile capire ciò che si desidera. Ovviamente questi pacchetti software aiuteranno lo streaming e la compressione tramite un numero di protocolli, ma chiaramente avrete bisogno di una "porta di rete" e non di una "porta video" per inviare lo streaming.

Se ciò che si intende è l'invio in uscita display tramite feed video/tv senza fili che è un altro discorso, ma avrete bisogno di consigli da esperti di hardware, piuttosto che esperti di software su questo.

In movimento. Ho fatto un sacco di streaming su protocolli MMS/UDP e vlc lo gestisce molto bene (come server e client). Tuttavia è progettato per i desktop e potrebbe non essere leggero come desideri. Penso che qualcosa come gstreamer, mencoder o ffmpeg sull'altra mano stiano andando meglio.Che tipo di CPU ha il robot? Avrai bisogno di un po 'di grinta se stai pianificando una compressione in tempo reale.

Per quanto riguarda il client, penso che troverete un numero di widget per gestire i video in GTK. Vorrei esaminarlo prima di preoccuparmi dei dettagli dell'interfaccia.

+0

Sì, mi dispiace. Intendevo "nuova porta di rete", per i dati video. Effettuato una modifica per riflettere questo. Anche modificato per informazioni sulla CPU. Non sono molto preoccupato per il widget gtkmm, so che posso usare solo un widget SDL se devo ... ma uno specifico per il video sarebbe ancora meglio. –