C# 实现 Linux 视频聊天、远程桌面(源码,支持信创国产化环境,银河麒麟,统信UOS)
园子里的有朋友在下载并了解了《C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)》中提供的源码后,留言给我说,这个视频会议有点复杂了,代码比较多,看得有些费劲。问我能不能整个简单点的Demo,只要有视频聊天和远程桌面的功能就可以。于是,我就又写了一个Demo来供大家参考,它可以在Windows和Linux(包括国产OS,如银河麒麟、统信UOS、深度Deepin等)上运行。
下图是在银河麒麟V10上运行的截图:

一.功能介绍
1. 视频聊天
(1)每个登录的用户都可向其他任意在线用户发送视频聊天请求。
(2)当收到来自其他在线用户的视频聊天邀请时,可接受或拒绝对方的请求。
(3)当接受其他在线用户的视频聊天邀请时,即可开启视频聊天。
2. 远程桌面
(1)每个登录的用户都可向其他任意在线用户发送远程桌面请求;当对方未响应时,可主动取消远程桌面请求。
(2)当收到来自其他在线用户请求控制桌面时,可接受或拒绝对方的请求。
(3)当发送方收到其他在线用户同意控制其电脑时,即可开启远程桌面连接。
(4)被控端和主控端都可主动断开远程桌面连接。
二.开发环境
1.开发工具:
Visual Studio 2022
2. 开发框架:
.NET Core 3.1,.NET 6,.NET 7
3.开发语言:
C#
4.其它框架:
CPF.net UI 框架、OMCS 语音视频框架
三.具体实现
下面我们讲一下Demo中核心的代码实现,大家从文末下载源码并对照着源码看,会更清楚些。
1.自定义消息类型 InformationTypes
public static class InformationTypes
{
/// <summary>
/// 视频请求 0
/// </summary>
public const int VideoRequest = 0; /// <summary>
/// 回复视频请求的结果 1
/// </summary>
public const int VideoResult = 1; /// <summary>
/// 通知对方 挂断 视频连接 2
/// </summary>
public const int CloseVideo = 2; /// <summary>
/// 通知好友 网络原因,导致 视频中断 3
/// </summary>
public const int NetReasonCloseVideo = 3; /// <summary>
/// 通知对方(忙线中) 挂断 视频连接 4
/// </summary>
public const int BusyLine = 4; /// <summary>
/// 远程桌面请求 5
/// </summary>
public const int DesktopRequest = 5; /// <summary>
/// 回复远程桌面请求的结果 6
/// </summary>
public const int DesktopResult = 6; /// <summary>
/// 主动取消远程桌面请求 7
/// </summary>
public const int CancelDesktop = 7; /// <summary>
/// 对方(主人端)主动断开远程桌面 8
/// </summary>
public const int OwnerCloseDesktop = 8; /// <summary>
/// 客人端断开远程桌面连接 9
/// </summary>
public const int GuestCloseDesktop = 9;
}
2. 发送视频请求
(1)当发起视频聊天时,将显示视频聊天窗口
/// <summary>
/// 显示视频聊天窗口
/// </summary>
/// <param name="wait">true表示自己为发送端</param>
public void RequestVideo(bool wait)
{
if (videoChat == null)
{
videoChat = DoCreateVideoChatForm(wait);
}
videoChat.Show();
IMultimediaManager mgr = MultimediaManagerFactory.GetSingleton();
if (mgr == null)
{
CommonHelper.ShowToolTip("无法启动多媒体设备!");
ClearVideoChat();
return;
}
this.videoChat.Initialize(mgr);
this.videoChat.SendVideoRequest(wait);
}
(2)连接自己的摄像头并发送视频通话请求
/// <summary>
/// 发送视频通话请求
/// </summary>
/// <param name="isSend">是否为发送者</param>
internal void SendVideoRequest(bool isSend)
{
this.StackPanel_Camera_myself.Visibility = Visibility.Visible;
this.dynamicCameraConnector_myself.ConnectEnded += DynamicCameraConnector_myself_ConnectEnded;
this.dynamicCameraConnector_myself.SetViewer(this.image_camera_myself);
this.dynamicCameraConnector_myself.BeginConnect(this.currentUserID);
if (isSend)
{
this.time_tip.Content = "正在等待对方回复";
App.multimediaManager.SendCustomizedMessage(this.friendID, InformationTypes.VideoRequest,null, null);
}
}
3. 回复对方视频请求
(1)当收到对方的视频聊天邀请时,将显示视频邀请窗口

(2)发送回复视频聊天请求消息
/// <summary>
/// 是否同意视频聊天请求
/// </summary>
/// <param name="isReceive">true表示同意,false表示拒绝</param>
private void ReplyVideoRequest(bool isReceive)
{
try
{
byte[] vs = BitConverter.GetBytes(isReceive);
App.multimediaManager.SendCustomizedMessage(this.friendId, InformationTypes.VideoResult, vs,null);
if (isReceive)
{
App.mainWindow.RequestVideo(false);
App.mainWindow.SetCurrentVideo(this.friendId);
}
else
{
CommonHelper.ShowToolTip("已拒绝对方视频通话邀请");
}
Close4BtnClick = true;
App.mainWindow.ClearVideoRequest();
}
catch(Exception e)
{
LoginWindow.FileAgileLogger.Log(e, "VideoRequestWindow.ReplyVideoRequest", ESBasic.Loggers.ErrorLevel.Standard);
}
}
4. 收到对方视频请求的回复
/// <summary>
/// 视频请求,收到对方回复
/// </summary>
/// <param name="OtherIsAgree">true表示同意,false表示拒绝</param>
internal void SendVideoRequestResult(bool OtherIsAgree)
{
if (OtherIsAgree)
{
this.OnAgree(this.friendID);
App.mainWindow.SetCurrentVideo(this.friendID);
}
else
{
CommonHelper.ShowToolTip("对方拒绝与您进行视频通话");
App.mainWindow.ClearVideoChat();
}
}
当对方回复同意时,将连接到对方的麦克风和摄像头,开始视频聊天会话:
/// <summary>
/// 对方同意视频会话
/// </summary>
public void OnAgree(string destLoginID)
{
try
{
startTime = DateTime.Now;
timer.Start();
this.friendLoginID = destLoginID != null? destLoginID: this.friendName;
this.lab_title.Content = string.Format("正在和{0}视频会话", this.friendName);
this.dynamicCameraConnector1.BeginConnect(this.friendLoginID);
this.microphoneConnector1.BeginConnect(this.friendLoginID);
this.microphoneConnector1.ConnectEnded += MicrophoneConnector1_ConnectEnded;
this.dynamicCameraConnector1.ConnectEnded += DynamicCameraConnector1_ConnectEnded;
this.dynamicCameraConnector1.Disconnected += DynamicCameraConnector1_Disconnected;
this.dynamicCameraConnector1.SetViewer(this.image_camera_other);
}
catch (Exception ee){}
}
5. 实现远程桌面
远程桌面的请求/应答逻辑几乎与视频聊天请求/应答逻辑是一模一样的。这里就不再罗列响应的代码了。
(1)当收到对方的远程桌面控制请求时,将显示请求窗口。

(2)当同意对方的控制请求时,对方就可以控制请求方的电脑了。

四.源码下载
源码下载:VideoChatMini.rar (若点击没有自动下载,可右键另存为)
1. 源码项目说明
下载源码压缩包,解压后,可以用 VS2022 打开解决方案,其中主要包括了如下几个项目:
(1) Oraycn.Demos.VideoChatMini.ClientWPF:视频聊天Windows 客户端(WPF版本)
(2) Oraycn.Demos.VideoChatMini.Server:视频聊天 Windows 服务端
(3) Oraycn.Demos.VideoChatMini.LinuxClient:视频聊天 Linux 客户端
(4) Oraycn.Demos.VideoChatMini.LinuxServer:视频聊天 Linux 服务端
注: Linux客户端内置的是x86/x64非托管so库,若需要其它架构的so,请联系QQ:2027224508 获取。
2. 在Linux上部署运行说明
在部署之前,需要在linux服务端和客户端上分别安装 .Net core 3.1版本,命令行安装命令如下:
yum install dotnet-sdk-3.1
检查版本安装情况
dotnet --version
运行:
(1)在CentOS上启动Oraycn.Demos.VideoChatMini.LinuxServer服务端:
拷贝Oraycn.Demos.VideoChatMini.LinuxServer项目下的Debug文件夹,到CentOS操作系统上,打开Debug -> netcoreapp3.1目录 ,在目录下打开终端,执行以下命令启动服务端

dotnet Oraycn.Demos.VideoChatMini.LinuxServer.dll
(2)在麒麟或统信UOS、Ubuntu上运行Oraycn.Demos.VideoChatMini.LinuxClient客户端:
拷贝Oraycn.Demos.VideoChatMini.LinuxClient项目下的Debug文件夹,到麒麟或统信UOS、Ubuntu操作系统上,打开Debug -> netcoreapp3.1目录 ,在目录下打开终端,执行以下命令启动客户端
dotnet Oraycn.Demos.VideoChatMini.LinuxClient.dll
命令执行成功后,就会出现之前截图的客户端主界面。
C# 实现 Linux 视频聊天、远程桌面(源码,支持信创国产化环境,银河麒麟,统信UOS)的更多相关文章
- linux下MySQL 5.6源码安装
linux下MySQL 5.6源码安装 1.下载:当前mysql版本到了5.6.20 http://dev.mysql.com/downloads/mysql 选择Source Code 2.必要软件 ...
- Azure VM对远程桌面登录的支持-示例
我们在开发Windows Azure的应用程序,虽然在大部分的情况下都可以使用Azure Emulator模拟器来模拟在云端计算节点(Azure VM)的执行结果,但是并不能100%模拟真正在Azur ...
- Linux下USB suspend/resume源码分析【转】
转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...
- QQ2008自动聊天精灵delphi源码
QQ2008自动聊天精灵delphi源码 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Grap ...
- Linux服务器中OpenSSH的源码编译与升级
Linux服务器中OpenSSH的源码编译与升级 https://www.oschina.net/question/12_7383
- linux下hadoop2.6.1源码64位的编译
linux下hadoop2.6.1源码64位的编译 一. 前言 Apache官网上提供的hadoop本地库是32位的,如果我们的Linux服务器是64位的话,就会现问题.我们在64位服务器执行Hado ...
- 修改Cosbench源码 支持s3的 http range request 测试场景
在视频点播的业务应用场景中,用户使用了ffmpeg工具做视频实时转码用. 而ffmpeg使用range 请求.而Cosbench不支持这种测试场景,所以需要修改源码支持这种测试场景. HTTP 协议介 ...
- 修改json源码支持datetime序列化
修改json源码支持datetime序列化 import json import datetime now = datetime.datetime.today() json.dumps(now) 抛出 ...
- remote desktop connect btw Mac, Windows, Linux(Ubuntu) Mac,Windows,Linux之间的远程桌面连接
目录 I. 预备 II. Mac连接Windows III. Windows连接Mac IV. Windows连接Ubuntu V. Mac连接Ubuntu VI. Ubuntu连接Mac VII, ...
- SSH客户端,FinalShell服务器管理,远程桌面加速软件,支持Windows,Mac OS X,Linux,版本2.6.3.1
FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求. 用户QQ群 342045988 Windows版下载地址:http:/ ...
随机推荐
- R语言文本数据挖掘(四)
文本分词,就是对文本进行合理的分割,从而可以比较快捷地获取关键信息.例如,电商平台要想了解更多消费者的心声,就需要对消费者的文本评论数据进行内在信息的数据挖掘分析,而文本分词是文本挖掘的重要步骤.R语 ...
- jinjia2基本用法
前言这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希望 ...
- [Linux]常用命令之【tar/zip/unzip/gzip/gunzip】
1 tar .tar与.gz有什么联系与区别? .tar 只是进行打包,并没有压缩. 则: 用tar-cvf进行打包 用tar-xvf进行解包. .tar.gz 是既打包又压缩 ,则: tar –cz ...
- [Linux]mysql错误总结-ERROR 1067 (42000): Invalid default value for TIMESTAMP
MySQL的TIMESTAMP类型的默认值设置无效. 0 使用环境描述 Linux CentOS 7.8.2003 x86/64bit MySQL: 5.7.24 (mysql --version / ...
- day60:Linux压缩与打包&用户管理&用户提权sudo&grep,sed,awk,sort,uniq
目录 1.文件管理-压缩与打包 2.用户管理 用户怎么查 如何创建用户 创建的用户信息都存储在哪? 用户存储密码的文件 如何为用户设定密码? 3.用户组 4.用户提权相关 5.Extra:额外补充 文 ...
- ArcGIS Pro发布地图服务(影像、矢量)
做GIS一般都是用ArcMap发布影像或者矢量服务,由于ArcGIS后续不在更新ArcMap,改用ArcGIS Pro,本文对ArcGIS Pro发布服务进行说明. 本文示例使用(因为portal的授 ...
- 音视频通讯QoS技术及其演进
利用多种算法和策略进行网络传输控制,最大限度满足弱网场景下的音视频用户体验. 良逸|技术作者 01 什么是QoS?音视频通讯QoS是哪一类? QoS(Quality of Service)是服务质量的 ...
- UE中根据场景模型,导出缩略图
在实际使用中,我们有了很多模型,但是有时候我们需要这些模型对应的缩略图,比如我有很多物品,我想弄个仓库,有2种方式,要么,弄个仓库场景,一个物体一个格子摆放第二种,就是为每个物体制作一个缩略图 如果一 ...
- [OpenCV-Python] 13 颜色空间转换
文章目录 OpenCV-Python:IV OpenCV中的图像处理 13 颜色空间转换 13.1 转换颜色空间 13.2 物体跟踪 13.3 怎样找到要跟踪对象的 HSV 值? OpenCV-Pyt ...
- Vue实战案例
Vue项目案例 结合之前学习的 vue.js.脚手架.vuex.vue-router.axios.elementui 等知识点,来开发前端项目案例(仅前端不含后端). 1.项目搭建 其实就是将我们项目 ...