1

画面共有機能が必要なクライアント/サーバー ソリューションを構築しています。すでに「機能している」ものがありますが、問題は、私の方法論が十分に高速ではないため、内部ネットワークでのみ機能することです。

私が基本的に行っていることは、クライアントがサーバーに 5 秒ごとに画面イメージを要求する要求を行うことです (たとえば)。そして、これは、このリクエストが受信されると処理されるコードです:

private void GetImage(object networkstream)
{
    NetworkStream network = (NetworkStream)networkstream;

    Bitmap bitmap = new Bitmap(
        SystemInformation.PrimaryMonitorSize.Width,
        SystemInformation.PrimaryMonitorSize.Height);
    Graphics g = Graphics.FromImage(bitmap);
    g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bitmap.Size);
    g.Flush();
    g.Dispose();

    MemoryStream ms = new MemoryStream();
    bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    bitmap.Dispose();

    byte[] array = ms.ToArray();

    network.Write(array, 0, array.Length);
    network.Flush();

    ms.Dispose();
}
  1. 私がやろうとしていることを行うための最良の方法は何ですか? 少なくとも 0.2 FPS を取得する必要があります (5 秒ごとに更新)。観察: Windows フォームを使用しており、ソケットを介して実行されています。

  2. TeamViewer と .rdp ファイルはどのように機能しますか?

4

3 に答える 3

2

既存の実装を使用するのはどうですか?それともそれから学ぶ? http://cdot.senecac.on.ca/projects/vncsharp/

于 2013-02-12T18:35:32.340 に答える
2

現在と前回の画像の差分のみ送信できます。こちらをご覧ください: C# で画像の違いを計算する

十分な速度が得られない場合は、画面を 100x100 または 50x50 ビットマップなどの小さいサイズに分割し、この領域が変更されたかどうかを確認し、変更された場合はクライアントに送信します。

于 2013-02-12T15:36:30.030 に答える
2

プロトコルを最適化する必要があります。いくつかの提案があります。

  • 入力画像をセグメントに分割し、フルスクリーンではなくセグメントを送信します
  • 以前に送信されたバージョンと異なる場合にのみ、セグメントを送信します
  • ビューアーがリクエストを送信するが、サーバーがプレゼンターから新しいセグメントを受信した場合にのみ応答を取得するhttp 通知タイプの通信を使用します。
  • 画像データを圧縮し、そのまま送信しないでください
  • 圧縮レベルを選択して処理を高速化したり、より良い画像を取得したりするオプションをユーザーに提供します
  • これが予算内に収まるとは思えませんが、ストリームをストリーミング ビデオとしてエンコードすることもできます
于 2013-02-12T15:37:14.983 に答える