MJPEG streaming et décodage
je veux recevoir des images JPEG d'une caméra IP (over RTSP). Pour cela, j'ai essayé cvCreateFileCapture_FFMPEG
in OpenCV. Mais ffmpeg semble avoir quelques problèmes avec le format MJPEG du streaming (puisqu'il essaie automatiquement de détecter les informations de streaming) et je finis avec l'erreur suivante
mjpeg: unsupported coding type
j'ai donc décidé d'utiliser live555 pour le streaming. Jusqu'à présent, je peux établir avec succès le streaming et la capture d'images (non-décodées) par openRTSP.
La question est de savoir comment puis-je le faire dans ma demande, par exemple dans OpenCV. Comment puis-je utiliser openRTSP dans OpenCV pour obtenir des images et les enregistrer au format JPEG?
j'ai entendu dire que les données d'openRTSP peuvent être envoyées à un buffer (ou un tube nommé) puis lues dans lesIplImage
. Mais je ne sais pas comment faire.
je suis vraiment reconnaissant de toute aide/suggestion à propos de ce problème. J'ai besoin de réponses de l'une des questions suivantes:
- Comment puis-je désactiver ffmpeg automatique flux d'informations de détection et de spécifier mes propres format (mjpeg), ou
- comment utiliser openRTSP dans OpenCV?
Cordialement,
1 réponses
est-ce une caméra IP Axis? De toute façon, la plupart des caméras IP qui fournissent MPEG4 RTSP stream qui peut être décodé en utilisant OpenCV en utilisant cvCreateFileCapture_FFMPEG. Toutefois, le décodeur ffmpeg est--9-- > MJPEG le codec a des problèmes non résolus largement connus. Je suis sûr que vous avez reçu un erreur type
[ingenient @ 0x97d20c0]Could not find codec parameters (Video: mjpeg)
Option1: en utilisant opencv, libcurl et libjpeg
pour voir le flux mjpeg dans opencv jetez un coup d'oeil à l'implémentation suivante
http://www.eecs.ucf.edu / ~ rpatrick/code / onelinksys.c ou http://cse.unl.edu / ~ rpatrick/code / onelinksys.c
Option2: en Utilisant gstreamer (pas de opencv)
je recommande de regarder gstreamer si votre but est juste de voir ou de sauver des images jpeg
view flux MJPEG on peut exécuter des médias pipeline de la chaîne suit
gst-launch -v souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec ! ffmpegcolorspace ! autovideosink
pour RTSP
gst-launch -v rtspsrc location="rtsp://[user]:[pass]@[ip]:[port]/[dir]/xxx.amp" debug=1 ! rtpmp4vdepay ! mpeg4videoparse ! ffdec_mpeg4 ! ffmpegcolorspace! autovideosink
Pour travailler avec l'API C voir
pour un exemple simple, jetez un coup d'oeil à mon autre message sur rtsp pour la construction de GStreamer C API media pipeline (c'est la même chose que la chaîne de lancement gst mais plutôt implémentée comme une API C)
jouer à RTSP avec python-gstreamer
save MJPEG flux d'images multiples, le pipeline (Laissez-nous mettre un flip vertical BIN et connecter le PADS à la précédente et la suivante bacs pour le rendre plus fantaisistes)
gst-launch souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec ! videoflip method=vertical-flip ! jpegenc ! multifilesink location=image-out-%05d.jpg
aussi peut-être intéressant jeter un oeil à tps-opencv
mise à jour:
Option3: utilisation de gstreamer, nommé Pipe et opencv
sur Linux on peut obtenir MJPEG stream et le convertir en mpeg4 et l'alimenter en un tube nommé. Puis lire les données de la pipe nommée dans opencv
Étape 1. Création De Canal Nommé
mkfifo stream_fifo
Étape 2. Créer opencvideo_test.c
// compile with gcc -ggdb `pkg-config --cflags --libs opencv` opencvvideo_test.c -o opencvvideo_test
#include <stdio.h>
#include "highgui.h"
#include "cv.h"
int main( int argc, char** argv){
IplImage *frame;
int key;
/* supply the AVI file to play */
assert( argc == 2 );
/* load the AVI file */
CvCapture *capture = cvCreateFileCapture(argv[1]) ;//cvCaptureFromAVI( argv[1] );
/* always check */
if( !capture ) return 1;
/* get fps, needed to set the delay */
int fps = ( int )cvGetCaptureProperty( capture, CV_CAP_PROP_FPS );
int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
/* display video */
cvNamedWindow( "video", CV_WINDOW_AUTOSIZE );
while( key != 'q' ) {
double t1=(double)cvGetTickCount();
/* get a frame */
frame = cvQueryFrame( capture );
double t2=(double)cvGetTickCount();
printf("time: %gms fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
/* always check */
if( !frame ) break;
/* display frame */
cvShowImage( "video", frame );
/* quit if user press 'q' */
key = cvWaitKey( 1000 / fps );
}
/* free memory */
cvReleaseCapture( &capture );
cvDestroyWindow( "video" );
return 0;
}
Étape 3. Préparer Pour Convertir MJPEG et MPEG4 en utilisant gstreamer (taux de trames entrantes critique)
gst-launch -v souphttpsrc location="http://<ip>/cgi_bin/<mjpeg>.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec ! queue ! videoscale ! 'video/x-raw-yuv, width=640, height=480'! queue ! videorate ! 'video/x-raw-yuv,framerate=30/1' ! queue ! ffmpegcolorspace ! 'video/x-raw-yuv,format=(fourcc)I420' ! ffenc_mpeg4 ! queue ! filesink location=stream_fifo
Étape 4. Affichage de Flux dans OpenCV
./opencvvideo_test stream_fifo