0

タイムラプスビデオフィードのようにjpeg画像を絶えず送信しているサーバーがあります。これらの画像をC#WinForm TCPクライアントで表示する必要があり、ストリーミングに問題があります。

私はここや同様の問題を抱えている他のサイトで多くの投稿を読みましたが、どれも私の問題の解決策を提供することができませんでした。

サーバーから画像を取得し、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だと思います)。

私が間違っていることや行方不明になっていることを誰かが指摘していただければ幸いです。

4

1 に答える 1

0

まず、ストリームから単一の画像を選択できる必要があります。サーバーが何らかの伝送フレームを使用しているかどうかを確認するか、画像ヘッダーを調べて、ストリームのどの部分が単一の画像を表しているかを確認する必要があります。単一の画像を表すデータを選択した場合にのみ、それを Bitmap コンストラクターに渡すことができます。

TCP 接続を使用する場合、フレーム形式を明示的に導入する必要があります。そうしないと、コンテンツの開始点と終了点を把握できなくなります。

于 2012-10-19T08:11:48.537 に答える