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:

  1. Comment puis-je désactiver ffmpeg automatique flux d'informations de détection et de spécifier mes propres format (mjpeg), ou
  2. comment utiliser openRTSP dans OpenCV?

Cordialement,

16
demandé sur Roman R. 2011-05-16 23:37:51

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

http://wiki.maemo.org/Documentation/Maemo_5_Developer_Guide/Using_Multimedia_Components/Camera_API_Usage

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
18
répondu enthusiasticgeek 2017-05-23 11:45:38