2016-06-22 8 views
0

私は組み込みLinuxプログラミングの初心者です。私は、IMI Gen4ミニチュア自動車用カメラと統合された腕皮質A15に取り組んでいます。今ではカメラでキャプチャしたリアルタイムのビデオを自分のローカルホストマシン(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")を読むとエラーになります。これは、カメラでキャプチャされたリアルタイムビデオで更新されている正しいファイルではありません。そうでない場合は、イーサネットでビデオをストリーミングする方法を教えてください。

+0

少し質問を改善しました – AlBlue

答えて

0

私はなぜあなたがそのような/ dev/video0を読み込もうとしているのか分かりません。/dev/video0は通常のファイルでも、通常のcharデバイスでもありません。代わりに、それはvideo4linuxデバイスであり、よく知られているAPIを公開しています。これは非常にうまくいきます。documented

gstreamerなどの上位レベルのフレームワークを利用して、サーバーからビデオをストリーミングすることをお勧めします。 gstreamerには、これを行う方法についての多くのドキュメントがあります。

まず、video4linuxに精通してから、gstreamerに慣れてください。良い練習は、組み込みプラットフォームで行う前にラップトップでカメラをストリーミングすることです。

関連する問題