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 秒刷新一次) Obs.:我正在使用 Windows 窗体,它是通过套接字完成的。

  2. TeamViwer 和 .rdp 文件如何工作?

4

3 回答 3

2

您只能发送当前图像和最后图像之间的差异。看这里:计算 C# 中的图像差异

如果它不够快,您可以将您的屏幕分成更小的,如 100x100 或 50x50 位图,检查该区域是否已更改,如果是,请将其发送给客户端。

于 2013-02-12T15:36:30.030 回答
2

您需要优化您的协议,这里有一些建议:

  • 分段输入图像,发送分段而不是全屏
  • 仅在与先前发送的版本不同时才发送段
  • 使用http 通知类型的通信,您的查看器发送请求但仅在服务器收到来自演示者的新片段(可能几个分组在一起)时才获得响应。
  • 压缩图像数据,不传输原始数据
  • 让用户可以选择压缩级别以加快速度或获得更好的图像
  • 我怀疑这是否在您的预算之内,但您也可以将流编码为流视频
于 2013-02-12T15:37:14.983 回答
2

使用现有的实现怎么样?还是从中学习? http://cdot.senecac.on.ca/projects/vncsharp/

于 2013-02-12T18:35:32.340 回答