前言
C#屏幕共享可以通过以下几种方式实现:
- 使用Socket通信 - 通过WebSocket传输图片,从而实现屏幕共享的效果。
- 使用VNC协议。
- 使用桌面流媒体传输协议(RDP) - RDP是一种专门用于远程桌面的协议,可以实现高效率、低延迟的远程桌面共享。
- 使用WebRTC - WebRTC是一种Web实时通信协议,可以实现Web浏览器之间的实时通信,包括屏幕共享。
总的来说,最好的实现方式应该根据具体的场景和需求来选择,以达到最好的效果。
使用Socket通信
https://www.psvmc.cn/article/2023-05-29-ws-csharp-web.html
这种方式画面传输效果不是很好。
传输图片也可以使用h264编解码:
https://www.psvmc.cn/article/2023-06-16-csharp-h264.html
使用VNC协议
目前未找到C#可用的VNCServer库。
使用RDP
这种方式要求PC开启允许远程连接,但是家庭版的系统不支持,并且连接时要求有帐号和密码,所以不推荐。
使用WebRTC
这里找到了两个库
SIPSorcery 完全使用C#开发的库,优点使用方便,缺点编解码较慢。
WebrtcSharp C#对C++库的封装,优点是效率高,缺点是使用略麻烦。
SIPSorcery
https://github.com/sipsorcery-org/sipsorcery
我们这里使用SIPSorcery这个库。
这个库要求项目是64位的。
安装依赖
1 | Install-Package SIPSorcery |
运行报错
System.IO.FileLoadException:“未能加载文件或程序集“Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.2, Culture=neutral, PublicKeyToken=adb9793829ddae60”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配
升级版本即可
1 | Install-Package Microsoft.Extensions.Logging.Abstractions -Version 7.0.0 |
C#发送
1 | private const int WEBSOCKET_PORT = 8081; |
其中ZVideoSource是自定义的桌面采集的类
ZVideoSource.cs
1 | namespace z_remote_control.Utils |
获取截图BGR的工具类
1 | using System.IO; |
Web接收
1 |
|
发送又接收
C#发送及接收
1 | private const int RTC_WS_PORT = 8081; |
Web端发送及接收
1 |
|
WebrtcSharp
WebrtcSharp
https://github.com/jatecl/WebrtcSharp
https://gitee.com/psvmc/webrtc-sharp
这个库只能推送画面不能接收画面
加载I420数据
安装依赖
1 | Install-Package OpenCvSharp4 -Version 4.1.1.20191110 |
示例
1 | private void Source_Frame(VideoFrame obj) |