线程在C ++中同步Ipcameras

时间:2014-08-19 15:39:39

标签: c++ multithreading ip-camera

我希望有人可以帮助我。我在Linux上的C ++应用程序中工作,我正在使用线程和IpCameras。

这是我的main.cpp代码:

int main(){

cv::VideoCapture cap("rtsp://admin:admin@X.X.x.X/0/video1");
cv::VideoCapture cap2("rtsp://admin:admin@X.X.X.x/0/video1");
cv::VideoCapture cap3("rtsp://admin:admin@X.X.X.X/0/video1");
cv::VideoCapture cap4("rtsp://admin:admin@X.X.X.X/0/video1");

While(1)
{

   switch(value)
   {

case a:

  pthread_detach(t1);
  cvDestroyAllWindows();
  pthread_create(&t1, NULL, &video1, NULL);
  break;

case b:

  pthread_detach(t1);
  cvDestroyAllWindows();
  pthread_create(&t1, NULL, &video2, NULL);
  break;

case c:

  pthread_detach(t1);
  cvDestroyAllWindows();
  pthread_create(&t1, NULL, &video3, NULL);
  break;

case d:

  pthread_detach(t1);
  cvDestroyAllWindows();
  pthread_create(&t1, NULL, &video4, NULL);
  break;

   }
}
}

以下是video1,video2,video3和video4的代码:

extern int v1;

extern cv::VideoCapture cap ;


void* videoFrontConfiguration(void*) {


Display* disp = XOpenDisplay(NULL);
Screen*  scrn = DefaultScreenOfDisplay(disp);
int height = scrn->height;
int width  = scrn->width;

//Frame declaration
            cv::Mat frame;

            //Create window for the ip cam video
              cv::namedWindow("Front", CV_WINDOW_NORMAL);



              cvSetWindowProperty( "Front", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN );



               //Position of the screen where the video is shows
               cvMoveWindow("Front", 0, 0);
            cvResizeWindow( "Front", width, height );

            //while we keep connected to the ip camera, we process the frames we receive
            while ( cap.isOpened())
            {
                //we get the frame from the ip camera
                cap.read(frame);

                //if the frame is empty we break
                if(frame.empty()) break;

                //we show the video frame in "video" window
                cv::imshow("Front", frame);

                if(v1 == 1){
                    v1 = 0;


                    pthread_exit(NULL);
                }

                //To close the window
                if(cv::waitKey(20) >= 0) break;

            }

}

问题是我正在使用RTSP摄像机,因此它是直播,但当我尝试运行应用程序并在几秒钟后开始显示摄像机时出现此错误:

    [1;31m[h264 @ 0x1d430] out of range intra chroma pred mode at 20 9
    [0m[1;31m[h264 @ 0x1d430] error while decoding MB 20 9              
    [0m[1;31m[h264 @ 0x1d430] P sub_mb_type 5 out of range at 2 12
    [0m[1;31m[h264 @ 0x1d430] error while decoding MB 2 12
    [0m[1;31m[h264 @ 0x1f0b0] out of range intra chroma pred mode at 11 1
    [0m[1;31m[h264 @ 0x1f0b0] error while decoding MB 11 1        

所以我认为,因为我在主线程中进行捕获,如下所示:

cv::VideoCapture cap("rtsp://admin:admin@X.X.x.X/0/video1");

然后我在另一个线程中渲染视频,也许这可能是同步的问题。但说实话,我不确定,因为我对IpCameras没有多少经验。

所以,如果有人想要制作属性同步,或者如果有其他问题,请告诉我。

非常感谢

1 个答案:

答案 0 :(得分:0)

您正在创建cv :: VideoCapture cap,cap1,cap2,cap3的四个实例,但在视频线程中,您只使用了cap变量。所以,如果我没有错,四个同步线程将从同一个cv :: VideoCapture实例读取。如果是这种情况,请尝试将cv :: VideoCapture对象作为参数传递给pthread_create函数(即最后一个参数)。