2014-11-21 65 views
1

我正在嘗試從客戶端向另一個客戶端發送實時視頻饋送,反之亦然。我正在使用TCP套接字。因此,AForge.NET可以幫助您從網絡攝像頭實際獲取視頻,並將其顯示爲PictureBox中的一組圖像。 AForge.NET正如預期那樣工作;它只是快速獲取圖像到另一個客戶端,這是問題。我已經嘗試了很多解決這個問題的方法。使用AForge.NET和Windows Forms流式傳輸實時視頻的方法有哪些?

其中之一是首先將整個網絡中的字節數作爲Int發送,然後通過圖像(幀)發送到客戶端。不過,由於某些原因,在如此多的幀(它每次變化)之後,它會收到一個不是要發送的字節的有效表示。我正在使用異步回調,因此可能會有一些延遲,或者它發送得太快。

然後我嘗試的另一個解決方案是將收到的字節設置爲可以通過TCP/IP發送的最大數量,然後用空格或其他填充字符填充空字節。然後檢查它有多大,你可以直接從字節數組中檢索(從頭開始),找到第一個非空格字符或特別包含的字符,以字節表示幀的結尾。這會更具活力,因爲每次都不需要大小,但由於恆定的大小非常大,效率下降了。有些問題需要特殊字節才能起作用。由於它是一個64位應用程序,因此單個字符爲2個字節。所以我將該字符添加到框架(最後)以表示框架停止的位置。但是當我跑過去時它無法檢測到它。所以也許我在使用字節時犯了一個錯誤,但是我覺得這個應該可以工作。

基本上,我想知道,使用AForge.NET,如何獲取視頻圖像,使用TCP套接字通過網絡將實況視頻從一個應用程序流式傳輸到下一個應用程序。

回答

0

你的第一個方法是正確的。您在機器之間傳輸的東西必須以傳輸的字節數開始,然後是實際的有效負載。您應該嘗試解決您在此方法中遇到的問題。

使用特殊值,零或其他值不適用於二進制數據。您的圖片數據可能包含一系列字節,這些字節恰好是您的定位值,您的圖片數據流將被破壞。

在通過TCP套接字傳輸數據時有很多事情需要注意。一個重要的是你收到一個流。接收處理程序可能獲得的字節數少於應用程序級另一側發送的字節數。可能甚至沒有足夠的字節來重建圖像長度變量。它必須消耗更多的流才能最終獲得發送的整個對象。

在C#中,您可以使用TcpClient,獲取其流並調用Read(),它將阻塞,直到從管道消耗足夠的字節。

在發送端仔細檢查像素格式(8bpp,24bpp,32bpp?)和可能的行填充。

另請注意,當您的事件處理程序返回時,AForge將處理位圖。尤其是,您不能將Bitmap引用傳送到另一個線程並從那裏發送,請製作您自己的副本。

相關問題