如何在客户端连接到服务器之前录制视频? Opencv C++ [关闭]

问题描述 投票:0回答:0

我的任务是编写一个程序,将视频从摄像机记录到 Mat 帧缓冲区,直到客户端连接。一旦客户端连接,视频录制就会停止,并且 Mat 缓冲区将开始传输到客户端。

我写了程序,但我认为我对Accept的看法是错误的。 我的程序正在运行,运行良好。我需要更改它,以便在客户端连接到服务器之前录制视频。现在,一开始,客户端连接,然后她已经开始录制。 是的,Accept 会阻止程序的操作,直到客户端连接到服务器。我需要一个条件来检查客户端与服务器的连接而不阻塞程序。

#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;
int c,new_socket;
int main()
{
    int sock,listener;
    struct sockaddr_in addr,client;

    sock = socket(AF_INET, SOCK_STREAM, 0);// подключение по сокету 
    if(sock < 0){
        perror("socket");
        exit(1);
    }
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);// подключается к любому ip

     if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { // связывание сокетов
        perror("[server] binding faild!");
        exit(2);
    }

listen(sock, 1); // прослушивание подключений
while (true){
     c = sizeof(struct sockaddr_in); // размер структуры
puts("Waiting for incoming connections...");
if((new_socket = accept(sock, (struct sockaddr *)&client,(socklen_t*)&c))) //принятие подключения и создания по него нового сокета
     {
         puts("Connection accepted");
         cout << "new_socket = " << new_socket << "\n";
     }
    int bbytee;
    cout << "before open the cam" << endl;

    VideoCapture cap(2); // захват видеокамеры

    if(!cap.isOpened()) { // проверка условий подключения
        cout<< "Could not open the camera" <<  endl;
        close(sock);
        return -1;
    }

    Mat frame;
    frame = Mat::zeros(1080, 1920, CV_8UC3); // заполнение нулями массива frame
    int imgSize = frame.cols*frame.rows*3; // узнаем размер изображения на три канала

    int cnt=0;
  
    while(1) {
        cap >> frame;// передача кадра с cap в frame 
        if(frame.empty()) {
            cerr<<"[client] VideoCapture(0) error!"<<endl;
        }

        cout<< ++cnt << ":"<< frame.isContinuous()<<"," <<frame.size()<<endl;;

        if( (bbytee = send(new_socket, frame.data, imgSize, 0)) < 0 ) {//передача данных в сокет
            cerr<< "bytes = " << bbytee << endl;
            break;
        }

       
        if(cap.get(1)>151){//если больше 151 кадра в массиве, то прекращает работу 
                        break;
                    }
    }
}
    close(sock);//закрытие сокета
    return 0;
}

c++ opencv tcp
© www.soinside.com 2019 - 2024. All rights reserved.