2011-09-27 29 views
8

Ho un flusso video in arrivo su rtp su ffmpeg e voglio collegarlo ai miei strumenti OpenCV per l'elaborazione live streaming. Il collegamento rtp funziona perché sono in grado di inviare i dati in arrivo a un file e riprodurli (o riprodurli se tramite ffplay). Anche l'implementazione di OpenCV è funzionale perché sono in grado di acquisire video da un file e anche da una webcam.Stream video da ffmpeg e acquisizione con OpenCV

Il problema è lo streaming su OpenCV. Ho sentito che questo può essere fatto usando una named pipe. Innanzitutto potrei trasmettere l'output ffmpeg alla pipe e quindi OpenCV aprire questa pipe e iniziare l'elaborazione.

Quello che ho provato:

Faccio un named-pipe nel mio Cygwin bash da:

$ mkfifo stream_pipe 

Avanti io uso il mio comando ffmpeg per tirare il flusso dal RTP e inviarlo al tubo:

$ ffmpeg -f avi -i rtp://xxx.xxx.xxx.xxx:1234 -f avi -y out.avi > stream_pipe 

non sono sicuro se questo è il modo giusto per andare circa l'invio del flusso alla named pipe, ma sembra essere accettare il comando e il lavoro a causa della uscita dal ffmpeg mi dà bitrate, fps e così via.

Avanti io uso la named pipe nella mia funzione di cattura OpenCV:

$ ./cvcap.exe stream_pipe 

dove il codice per cvcap.cpp si riduce a questo:

cv::VideoCapture *pIns = new cv::VideoCapture(argv[1]); 

Il programma sembra bloccarsi quando il raggiungimento di questo una riga, quindi, mi chiedo se questo è il modo giusto di fare questo. Non ho mai usato pipe con nome prima e non sono sicuro che questo sia l'uso corretto. Inoltre, non so se ho bisogno di gestire la named pipe in modo diverso in OpenCV - cambia codice in giro per accettare questo tipo di input. Come ho detto, il mio codice accetta già i file e gli ingressi delle telecamere, sono appena riattaccato su un flusso in arrivo. Ho solo sentito che i pipe nominati possono essere usati per OpenCV - Non ho visto alcun codice o comandi reali!

Qualsiasi aiuto o approfondimento sono apprezzati!

UPDATE:

Credo named pipe potrebbero non funzionare nel modo che intendevo. Come visto su this post sul forum cygwin:

Il problema è che l'implementazione di Cygwin di fifos è molto buggata. Non consiglierei l'uso di fifos per qualsiasi cosa tranne la più semplice delle applicazioni.

Potrei aver bisogno di trovare un altro modo per farlo. Ho provato a reindirizzare l'output ffmpeg in un file normale e poi a OpenCV leggerlo allo stesso tempo. Questo funziona in una certa misura, ma immagino che possa essere pericoloso leggere e scrivere contemporaneamente da un file - chissà cosa succederebbe!

+0

Ho cercato di fare qualcosa di simile. Hai trovato qualche articolo che spiega la pipa/etc? –

+2

Ho trovato questo piccolo post http://ffmpeg-users.933282.n4.nabble.com/h264-problem-td2574908.html nel forum ffmpeg-users che suggerisce ciò che ha realizzato, il che mi ha dato speranza. Ho anche trovato qualcuno che prova questo con VLC http://forum.videolan.org/viewtopic.php?f=32&t=69351 e qualcosa di simile con x264 http://forums.creativecow.net/readpost/291/84 – chembrad

risposta

9

spero che non sia troppo tardi per rispondere, ma ho provato la stessa cosa qualche tempo fa, ed ecco come l'ho fatto.

Il backend di decodifica video per OpenCV è in realtà ffmpeg, quindi tutte le sue facitiliti sono disponibili anche in OpenCV.Non tutta l'interfaccia è esposta e questo aggiunge alcune difficoltà, ma è possibile inviare l'indirizzo del flusso rtp a OpenCV.

cap.open("rtp://xxx.xxx.xxx.xxx:1234"); 

Importante: OpenCV non è in grado di accedere a flussi RTP protetti da password. Per fare ciò, è necessario fornire il nome utente e la password, non ci sono API esposte per questo.

+0

Potresti si prega di citare il comando utilizzato per lo streaming del file su rtp? Hai usato solo ffmpeg per questo? O hai dovuto installare qualcos'altro? – user2565010

+0

Ciao signore! Potresti dire come scrivere l'immagine nello stream rtmp per inviare su rete, usando opencv. Grazie! –