многопоточность — потоки синхронизируются для Ipcameras в переполнении стека

Я надеюсь, что кто-то может помочь мне. Я работаю в приложении C ++ для Linux, в котором я использую потоки и IpCameras.

Это мой код main.cpp:

int main(){

cv::VideoCapture cap("rtsp://admin:[email protected]/0/video1");
cv::VideoCapture cap2("rtsp://admin:[email protected]/0/video1");
cv::VideoCapture cap3("rtsp://admin:[email protected]/0/video1");
cv::VideoCapture cap4("rtsp://admin:[email protected]/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;

}
}
}

Вот код видео1, видео2, видео3 и видео4:

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:[email protected]/0/video1");

и затем я рендерил видео в другом потоке, возможно, это могло быть проблемой синхронизации. Но если честно, я не уверен, потому что у меня нет большого опыта работы с IpCameras.

Поэтому, пожалуйста, если у кого-то есть идея сделать правильную синхронизацию или если это другая проблема, пожалуйста, дайте мне знать.

огромное спасибо

0

Решение

Вы создаете четыре экземпляра cv :: VideoCapture cap, cap1, cap2, cap3, но в видеопотоках вы используете только переменную cap. Так что, если я не ошибаюсь, четыре одновременных потока будут читать из одного экземпляра cv :: VideoCapture. Если это так, попробуйте передать объект cv :: VideoCapture в качестве аргумента функции pthread_create (т.е. последний аргумент).

0

Другие решения


По вопросам рекламы [email protected]