首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MJPEG流和解码

MJPEG流和解码
EN

Stack Overflow用户
提问于 2011-05-17 03:37:52
回答 1查看 32.6K关注 0票数 16

我想从IP摄像机接收JPEG图像(通过RTSP)。为此,我在OpenCV中尝试了cvCreateFileCapture_FFMPEG。但是ffmpeg似乎对流的MJPEG格式有一些问题(因为它会自动尝试检测流信息),我最终得到了以下错误

代码语言:javascript
复制
mjpeg: unsupported coding type

然后,我决定使用live555进行流媒体。到目前为止,我可以通过openRTSP成功地建立流和捕获(非解码)图像。

问题是我如何在我的应用程序中做到这一点,例如在OpenCV中。如何在OpenCV中使用openRTSP获取图像并将其保存为JPEG格式?

我听说来自openRTSP的数据可以被发送到一个缓冲区(或命名管道),然后在OpenCV的IplImage中读取。但我不知道该怎么做。

我将非常感谢在这个问题上的任何帮助/建议。我需要以下任一问题的答案:

  1. 如何禁用ffmpeg的自动流信息检测并指定自己的格式(mjpeg)或
  2. 如何在OpenCV中使用openRTSP?

致以敬意,

EN

回答 1

Stack Overflow用户

发布于 2011-08-17 03:47:42

这是Axis的IP摄像头吗?无论哪种方式,大多数提供MPEG4 RTSP流的IP摄像机都可以通过使用cvCreateFileCapture_FFMPEG.的OpenCV进行解码但是,ffmpeg解码器的MJPEG编解码器有一个广为人知的悬而未决的问题。我确信您会收到类似于以下内容的错误

代码语言:javascript
复制
[ingenient @ 0x97d20c0]Could not find codec parameters (Video: mjpeg)

Option1 :使用opencv、libcurl和libjpeg

要在opencv中查看mjpeg流,请看下面的实现

http://www.eecs.ucf.edu/~rpatrick/code/onelinksys.chttp://cse.unl.edu/~rpatrick/code/onelinksys.c

Option2:使用gstreamer (无opencv)

如果您的目标只是查看或保存jpeg图像,我建议您查看gstreamer。

查看 MJPEG流,可以执行媒体管道字符串,如下所示

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

对于RTSP

代码语言:javascript
复制
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

举一个简单的例子,看看我在rtsp上关于构建gstreamer C API媒体管道的另一篇文章(这与gst-launch字符串相同,但更像是作为C API实现的)

Playing RTSP with python-gstreamer

要将 MJPEG流保存为流水线中的多个图像(让我们放置一个垂直翻转,并将PADS连接到上一个和下一个BINS,使其更美观)

代码语言:javascript
复制
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

更新:

Option3:使用gstreamer、命名管道和opencv

在Linux上,可以获得mjpeg流,并将其转换为mpeg4并将其提供给命名管道。然后从opencv中的命名管道读取数据

步骤1.创建命名管道

代码语言:javascript
复制
mkfifo stream_fifo

步骤2.创建opencvvideo_test.c

代码语言:javascript
复制
// 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 (关键的传入帧速率)

代码语言:javascript
复制
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中显示流

代码语言:javascript
复制
  ./opencvvideo_test stream_fifo
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6022423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档