windows下实现屏幕分享(C#)

该博客介绍了一种使用C#、UDP广播和Redis实现的低延迟Windows屏幕分享方法。通过UDP广播减少通讯负载和延迟,Redis用于存储超过UDP包大小限制的屏幕截图数据。整个过程包括发起端、接收端和缓存端,实现了150毫秒内的延迟。源码已开源在CSDN和Gitee上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

采用UDP广播进行数据的传输,实现windows下进行低延迟的屏幕共享。

开发语言:C#

第三方组件:Redis

 

1.实现思路

 

总体流程图

DGIS.DesktopShare实现windows下屏幕分享低延迟功能,按照服务执行位置由三部分构成:发起端、接收端、缓存端。

通过UDP广播实现发起端和接收端的通讯,是为了尽量的减少通讯负载和降低延迟。众所周知UDP是所有通讯协议中延迟最低的(但也有受网络因素丢包的问题,这里作为局域网同屏,暂不考虑丢包问题),而采用广播的方式可以有效的降低发起端的性能负担。

增加一个Redis服务,是为了减少UDP广播数据,按照1920*1080分辨率的截屏数据来算,单张图片已经超过了UDP单包的最大数据量1472字节,倘若直接使用UDP传输截屏图片,需要额外的进行封包拆包,这样不仅浪费了程序执行时间,也增加了发送端和接收端的代码复杂度。本着最低延迟的目的,将真实的图片数据存入Redis缓存,只通过UDP广播Redis中对应的UID信息即可,这也是本程序最核心的地方。接收端接收到UID的数据后,再自行去获取Redis中真实的数据进行解析。

2.代码结构

 

DGIS.DesktopShare.Service的代码结构分为Frm(窗体)、IService(接口)、Service(实现)三个部分。引用的第三方dll有Redis相关操作库、屏幕获取相关库和DGIS开头的辅助操作库。

Frm:

ImgDisplyFrm是接收端的默认显示界面,包含一个PictureBox控件,显示接收到的屏幕图像。

IService:

IDesktopShareService屏幕共享操作接口,主要方法有4个。

注释的已经很明确了,这里不多说。

Service:

DesktopShareService:IDesktopShareService的实现类,里面是详细的实现方法。核心的代码有下面几个地方:

 1  public void Start(int frameRate, bool mouseDisplay, int port)
 2         {
 3             _udpService = new UdpBroadcastService(port,
 4                 bytes =>
 5                 {
 6                     //deskShareFrm.ShowImg(bytes);
 7                 });
 8 
 9             _desktopCapturer = CapturerFactory.CreateDesktopCapturer(frameRate, mouseDisplay);
10             _desktopCapturer.ImageCaptured += ImageCaptured;
11             _desktopCapturer.Start();
12 
13             //队列循环处理积压的图片
14             //Task.Factory.StartNew(() =>
15             //{
16             //    while (true)
17             //    {
18             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值