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