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!
Ho cercato di fare qualcosa di simile. Hai trovato qualche articolo che spiega la pipa/etc? –
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