我正在构建一个需要屏幕共享功能的客户端/服务器解决方案。我有一些东西已经"工作"了,但问题是它只在内部网络上工作,因为我的方法不够快。
我基本上要做的是,客户端每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();
}
做我想做的事情最好的方法是什么?我需要获得至少0.2 FPS(每5秒刷新一次)Obs.:我使用的是Windows窗体,它是通过套接字完成的。
TeamViwer和.rdp文件是如何工作的?
您只能发送当前图像和最后一张图像之间的差异。看这里:计算C#中的图像差异
如果速度不够快,您可以将屏幕划分为更小的部分,如100x100或50x50位图,检查该区域是否已更改,如果已更改,则将其发送给客户端。
您需要优化您的协议,这里有一些建议:
- 将输入图像分段,发送分段而不是全屏
- 仅当分段与以前发送的版本不同时才发送分段
- 使用http通知类型的通信,在这种通信中,查看器发送请求,但只有在服务器接收到来自演示者的新片段(可能是几个片段组合在一起)时才会得到响应
- 压缩图像数据,不传输原始数据
- 让用户可以选择压缩级别以加快速度或获得更好的图像
- 我怀疑这是否在你的预算内,但你也可以将流编码为流媒体视频
使用现有实现怎么样?还是从中学习?http://cdot.senecac.on.ca/projects/vncsharp/