2012-10-19 91 views
0

我有一臺服務器不斷地傳輸jpeg圖像,如時間推移視頻源。我需要在C#WinForm TCP客戶端中顯示這些圖像,並且遇到流式處理問題。如何讀取從服務器流式傳輸的jpeg圖像

我在這裏和其他網站上閱讀了大量的帖子,但其中沒有一個能夠提供解決方案來解決我的問題。

我有下面的代碼,其目的是從該服務器檢索該圖像並使用PictureBox控件顯示它:(存在圖像流中的頭信息)

while (true) 
{ 
    NetworkStream stream = m_client.GetStream(); //Get the data stream from the server 

    //Load Image 
    while (stream.DataAvailable) 
    { 
     byte[] buffer = new byte[m_client.ReceiveBufferSize]; 
     stream.Read(buffer, 0, buffer.Length); 
     string tempString = System.Text.Encoding.ASCII.GetString(buffer); 
     //split header info and data into separate strings 
     string[] splitString = tempString.Split(new string[] { "]" }, 2, StringSplitOptions.None); 
     splitString[0] = splitString[0].Replace(@"\", ""); 
     //split header info into separate strings for use later 
     string[] imageInfo = splitString[0].Split('|'); 

     int size = Convert.ToInt32(tempString.Length); 
     //int offset = splitString[0].Length; 
     buffer = new byte[size]; 
     stream.Read(buffer, 0, buffer.Length); 

     //Convert Image Data To Image 
     MemoryStream imageStream = new MemoryStream(buffer, 0, buffer.Length); 
     imageStream.Position = 0; 
     Bitmap img = new Bitmap(imageStream); 

     //set the image display box properties 
     VideoBox.Width = img.Width; 
     VideoBox.Height = img.Height; 
     VideoBox.Image = img; //Show the image in the picturebox 
    } 
    stream.Flush(); 
} 

目前這個代碼運行,只要到Bitmap img = new Bitmap(imageStream);它給出的參數是無效的錯誤。

這是我第一次做這個,所以在接下來的嘗試中有點失落,我花了最後一天嘗試不同的解決方案,但這個似乎是迄今爲止最好的(我認爲:s )。

我將不勝感激,如果任何人都可以指出我做錯了或失蹤。

+0

服務器是否使用單個TCP連接傳輸多個圖像? – empi

+0

我無法訪問源代碼,但據我所知,它通過單個連接以連續的週期發送多個圖像。 – enigma20

+0

我有這樣的信息:視頻協議示例\ [VIDEO-FAULT \ | 2204771255 \],視頻幀數據包示例\ [JPEG-VIDEO \ | C2013 \ | FrameWidth \ | FrameHeight \ | DateTime \ | ImageDataSize \] ... ImageDataSize binary bytes形成圖像 – enigma20

回答

0

首先,您必須能夠從流中選擇單個圖像。您可以檢查服務器是否使用某種傳輸幀,或者您必須檢查圖像頭以確定哪部分流代表單個圖像。只有當你選擇了表示單個圖像的數據時,才能將它傳遞給位圖構造函數。

當使用TCP連接時,你必須明確地引入一些幀格式。否則,您將無法確定您的內容開始和結束的位置。

+0

我設法從圖像數據包中挑選標題信息,然後將其餘部分(應該是圖像數據)作爲單獨的字符串。不過,在VS2010調試器中,這一切看起來都像行話一樣,無論我放在內存流中,它總是給參數無效。我不知道我應該怎麼做 – enigma20

相關問題