web-dev-qa-db-ja.com

MJPEGストリーミングとデコード

IPカメラ(RTSP経由)からJPEG画像を受信したい。このために、OpenCVでcvCreateFileCapture_FFMPEGを試しました。しかし、ffmpegはストリーミングのMJPEG形式に問題があるようです(ストリーミング情報を自動的に検出しようとするため)、次のエラーが発生します

mjpeg: unsupported coding type

そこで、ストリーミングにlive555を使用することにしました。今まで、openRTSPを介してストリーミングを確立し、(デコードされていない)画像をキャプチャすることができました。

問題は、OpenCVなどのアプリケーションでこれをどのように行うことができるかです。 OpenCVでopenRTSPを使用して画像を取得し、JPEG形式で保存するにはどうすればよいですか?

OpenRTSPからのデータは、バッファー(または名前付きパイプ)に送信してから、OpenCVのIplImageで読み取ることができると聞きました。しかし、私はこれを行う方法がわかりません。

私はこの問題についての助け/提案に本当に感謝します。次の質問のいずれかの回答が必要です。

  1. Ffmpegの自動ストリーム情報検出を無効にして、独自の形式(mjpeg)を指定するにはどうすればよいですか?
  2. OpenCVでopenRTSPを使用するにはどうすればよいですか?

よろしく、

16
umair

これはAxisIPカメラですか?いずれにせよ、MPEG4 RTSPストリームを提供するほとんどのIPカメラはcvCreateFileCapture_FFMPEGを使用してOpenCVを使用してデコードできます。ただし、ffmpegデコーダーの[〜#〜] mjpeg [〜#〜]コーデックには広く知られている未解決の問題があります。 errorに似たものを受け取ったと思います

[ingenient @ 0x97d20c0]Could not find codec parameters (Video: mjpeg)

オプション1:opencv、libcurl、libjpegを使用

Opencvでmjpegストリームを表示するには、次の実装を見てください

http://www.eecs.ucf.edu/~rpatrick/code/onelinksys.c または http://cse.unl.edu/~rpatrick/code/onelinksys.c

オプション2:gstreamerを使用(opencvなし)

Jpeg画像を表示または保存するだけの場合は、gstreamerを参照することをお勧めします

view MJPEGストリームには、次のようにメディアパイプライン文字列を実行できます。

gst-launch -v souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec ! ffmpegcolorspace ! autovideosink

RTSPの場合

gst-launch -v rtspsrc location="rtsp://[user]:[pass]@[ip]:[port]/[dir]/xxx.amp" debug=1 ! rtpmp4vdepay ! mpeg4videoparse ! ffdec_mpeg4 ! ffmpegcolorspace! autovideosink

C APIを使用するには、を参照してください。

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

簡単な例として、gstreamer C APIメディアパイプラインを構築するためのrtspに関する他の投稿を見てください(これはgst-launch文字列と同じですが、C APIとして実装されています)

python-gstreamerでRTSPを再生する

save MJPEGストリームを複数の画像としてパイプラインに(垂直フリップ[〜#〜] bin [〜#〜]を配置し、[〜 #〜] pads [〜#〜]前と次へ[〜#〜] bins [〜#〜]より魅力的にする)

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

また、おそらく一見の価値がありますgst-opencv

更新:

オプション3:gstreamer、名前付きパイプ、opencvを使用

Linuxでは、mjpegストリームを取得してmpeg4に変換し、名前付きパイプにフィードすることができます。次に、opencvの名前付きパイプからデータを読み取ります

手順1.名前付きパイプを作成する

mkfifo stream_fifo

ステップ2.opencvvideo_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;
}

ステップ3.gstreamerを使用してMJPEGからMPEG4に変換する準備をします(着信フレームのレートが重要です)

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

ステップ4.OpenCVでストリームを表示する

  ./opencvvideo_test stream_fifo
18