2015-12-31 209 views
-1

我正在接收連續的視頻流,我必須解碼並顯示它。 相機每秒發送大約20k個數據包(1288字節)。我正在流到10秒鐘,攝像機停止傳輸流。我認爲這是由於緩衝區。我正試圖通過此代碼清除我的緩衝區:Rx緩衝Winsock Socket編程C++。如何清除RX緩衝區?

long a = 9965535; 
    if (setsockopt(camm, SOL_SOCKET, SO_RCVBUF, (const char*)&a, sizeof(long)) == -1) { 
     fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno)); 
    } 


    do{ 

      Siz = recvfrom(camm, message, 1300, 0, (struct sockaddr *) &cam, &caml); 

      image(message, Siz); 
       aab++; 
       if (aab > 1000){ 
      // memset((char *)&ap, 0, 65535);// &ap, 65535 
      //ap = "1288"; 
//     memset(&a, 0, 9965535); 
//     *loc = 9965535; 
//     memset(loc, 0, 9965535); 
        aab = 0; 
        } 
     } while (Siz > 0); 

任何人都可以幫我解決這個問題嗎?

其實我不希望完整的幀被解碼。我只需要解碼可用的幀。意味着丟棄無法處理的剩餘幀。

+0

您的循環不正確。它應該是'while((Siz = recvfrom(...))> 0)'。否則,即使在數據流結束時也要處理數據。 – EJP

+0

我做到了,感謝您注意到這個 –

回答

1

唯一的方法是從套接字實際讀取。您可能會考慮在專用線程中執行讀取操作,並且只有在緩衝區爲空時纔將視頻幀存儲在內存緩衝區中,同時丟棄其他幀。另一個線程可以根據需要按自己的時間讀取和清除內存緩衝區。

+1

程序一直在正常工作,這是相機問題,相機需要一點高的連續流。謝謝你們的幫助。 –