使用服务器 - 客户端通信在以太网上实时视频流(来自扶手板上的摄像头)

时间:2016-06-22 14:14:13

标签: video-streaming client-server embedded-linux

我是嵌入式Linux编程的新手。我正在研究手臂皮质A15,它与IMI Gen4微型汽车摄像头集成。现在我需要将摄像头拍摄的实时视频发送到我的本地主机(基于linux)。

服务器端:

int main(void)
{
    int listenfd = 0;
    int connfd = 0;
    struct sockaddr_in serv_addr,client;
    char sendBuff[];
    int numrv;

    listenfd = socket(AF_INET, SOCK_STREAM, 0);

    printf("Socket retrieve success\n");

    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(5000);

    bind(listenfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr));

    if(listen(listenfd, 10) == -1)
    {
        printf("Failed to listen\n");
        return -1;
    }


    while(1)
    {
        connfd = accept(listenfd, (struct sockaddr*) &client ,sizeof(client));

        /* Open the file that we wish to transfer */
        FILE *fp = fopen("/dev/video0","rb");
        if(fp==NULL)
        {
            printf("File opern error");
            return 1;   
        }   

        /* Read data from file and send it */
        while(1)
        {
            /* First read file in chunks of 256 bytes */
            unsigned char buff[256]={0};
            int nread = fread(buff,1,256,fp);
            printf("Bytes read %d \n", nread);        

            /* If read was success, send data. */
            if(nread > 0)
            {
                printf("Sending \n");
                write(connfd, buff, nread);
            }

            /*
             * There is something tricky going on with read .. 
             * Either there was error, or we reached end of file.
             */
            if (nread < 256)
            {
                if (feof(fp))
                    printf("End of file\n");
                if (ferror(fp))
                    printf("Error reading\n");
                break;
            }


        }

        close(connfd);
        sleep(1);
    }


    return 0;
}

客户方:

int main(void)
{
    int sockfd = 0;
    int bytesReceived = 0;
    char recvBuff[256];
    memset(recvBuff, '0', sizeof(recvBuff));
    struct sockaddr_in serv_addr;

    /* Create a socket first */
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
    {
        printf("\n Error : Could not create socket \n");
        return 1;
    }

    /* Initialize sockaddr_in data structure */
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000); // port
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    /* Attempt a connection */
    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
    {
        printf("\n Error : Connect Failed \n");
        return 1;
    }

    /* Create file where data will be stored */
    FILE *fp;
    fp = fopen("video.txt", "ab"); 
    if(NULL == fp)
    {
        printf("Error opening file");
        return 1;
    }

    /* Receive data in chunks of 256 bytes */
    while((bytesReceived = read(sockfd, recvBuff, 256)) > 0)
    {
        printf("Bytes received %d\n",bytesReceived);    
        // recvBuff[n] = 0;
        fwrite(recvBuff, 1,bytesReceived,fp);
        // printf("%s \n", recvBuff);
    }

    if(bytesReceived < 0)
    {
        printf("\n Read Error \n");
    }


    return 0;
}

我尝试在我的本地主机端运行服务器代码和客户端上的客户端。但是我在阅读/dev/video0文件printf("Error reading\n")时遇到错误。这不是通过相机捕获的实时视频更新的正确文件。如果没有,请告诉我如何在以太网上传输视频。

1 个答案:

答案 0 :(得分:0)

我不知道你为什么要这样读/ dev / video0。 / dev / video0既不是常规文件,也不是常规字符设备。相反,它是一个video4linux设备,因此暴露了一个众所周知的API,非常好documented

我建议尝试利用一些更高级别的框架,例如gstreamer来从服务器流式传输视频。有很多关于gstreamer的文档以及如何做到这一点。

首先应熟悉video4linux,然后熟悉gstreamer。一个很好的练习是在嵌入式平台上进行相机在笔记本电脑上流式传输。