从MJPEG流中获取一个图像帧

时间:2013-04-20 10:26:52

标签: c video libcurl ip-camera mjpeg

我有VideoSec IP摄像头,以及在嵌入式Linux NPE控制器上运行的守护进程。守护进程需要从IP摄像机中识别图像,该部分采用标准方式的libcurl实现,并且使用轴摄像头工作正常:

static size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
     size_t written = fwrite(ptr, size, nmemb, stream);
     return written;
}

void refreshCameraImage(char *target, char *url)
{
     CURL *image;
     CURLcode imgresult;
     FILE *fp;

     image = curl_easy_init();

     if (image)
     {
          fp = fopen(target, "wb");
          if(fp == NULL)
          printf("\nFile cannot be opened");


          curl_easy_setopt(image, CURLOPT_URL, url);
          curl_easy_setopt(image, CURLOPT_WRITEFUNCTION, NULL);
          curl_easy_setopt(image, CURLOPT_WRITEDATA, fp);

          imgresult = curl_easy_perform(image);
          if( imgresult )
          {
               printf("\nCannot grab the image!");
          }
     }
     curl_easy_cleanup(image);
     fclose(fp);
}

VideoSec相机的问题在于我无法定义任何jpeg流,只能定义MJPEG。 所以,我需要一种方法从libjl中只从mjpeg流中获取一个帧。 OpenCV不是一个选择。

1 个答案:

答案 0 :(得分:1)

在M-JPEG中,JPEG图像完整嵌入,并由带有子标题的文本分隔符分隔。因此,提取JPEG是一件容易的事情:

  • 您在响应正文中找到第一个/下一个子标题/分隔符
  • 您找到Content-Length值(如果有)
  • 您跳到\ r \ n \ r \ n以找到JPEG数据的开头
  • 您收到JPEG数据以获取Content-Length字节数,或者如果长度不可用,则在您获得下一个分隔符之前阅读

结果数据正好是JPEG文件/图像/流。