http://cnblogs.com/shawshank/p/17420469.html
问我能不能整个简单点的Demo,只要有视频聊天和远程桌面的功能就可以。于是,我就又写了一个Demo来供大家参考,它可以在Windows和Linux(包括国产OS,如银河麒麟、统信UOS、深度Deepin等)上运行。
下图是在银河麒麟V10上运行的截图
一、功能介绍
1、视频聊天
每个登录的用户都可向其他任意在线用户发送视频聊天请求。
当收到来自其他在线用户的视频聊天邀请时,可接受或拒绝对方的请求。
当接受其他在线用户的视频聊天邀请时,即可开启视频聊天。
2、远程桌面
每个登录的用户都可向其他任意在线用户发送远程桌面请求;当对方未响应时,可主动取消远程桌面请求。
当收到来自其他在线用户请求控制桌面时,可接受或拒绝对方的请求。
当发送方收到其他在线用户同意控制其电脑时,即可开启远程桌面连接。
被控端和主控端都可主动断开远程桌面连接。
二、开发环境
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
{
///
/// 视频请求 0
///
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、发送视频请求
发起视频聊天时,将显示视频聊天窗口
///
/// 显示视频聊天窗口
///
/// true表示自己为发送端
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);
}
连接自己的摄像头并发送视频通话请求
///
/// 发送视频通话请求
///
/// 是否为发送者
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、回复对方视频请求
当收到对方的视频聊天邀请时,将显示视频邀请窗口
图片
发送回复视频聊天请求消息
///
/// 是否同意视频聊天请求
///
/// true表示同意,false表示拒绝
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、收到对方视频请求的回复
///
/// 视频请求,收到对方回复
///
/// true表示同意,false表示拒绝
internal void SendVideoRequestResult(bool OtherIsAgree)
{
if (OtherIsAgree)
{
this.OnAgree(this.friendID);
App.mainWindow.SetCurrentVideo(this.friendID);
}
else
{
CommonHelper.ShowToolTip(“对方拒绝与您进行视频通话”);
App.mainWindow.ClearVideoChat();
}
}
当对方回复同意时,将连接到对方的麦克风和摄像头,开始视频聊天会话:
///
/// 对方同意视频会话
///
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、实现远程桌面
远程桌面的请求/应答逻辑几乎与视频聊天请求/应答逻辑是一模一样的。这里就不再罗列响应的代码了。
当收到对方的远程桌面控制请求时,将显示请求窗口。
图片
当同意对方的控制请求时,对方就可以控制请求方的电脑了。
图片
四、源码下载
源码下载:VideoChatMini.rar
http://www.oraycn.com/DownLoadFiles/OMCS/VideoChatMini.rar
1、源码项目说明
下载源码压缩包,解压后,可以用 VS2022 打开解决方案,其中主要包括了如下几个项目:
Oraycn.Demos.VideoChatMini.ClientWPF:视频聊天Windows 客户端(WPF版本)
Oraycn.Demos.VideoChatMini.Server:视频聊天 Windows 服务端
Oraycn.Demos.VideoChatMini.LinuxClient:视频聊天 Linux 客户端
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
运行
在CentOS上启动Oraycn.Demos.VideoChatMini.LinuxServer服务端
拷贝Oraycn.Demos.VideoChatMini.LinuxServer项目下的Debug文件夹,到CentOS操作系统上,打开Debug -> netcoreapp3.1目录 ,在目录下打开终端,执行以下命令启动服务端
图片
dotnet Oraycn.Demos.VideoChatMini.LinuxServer.dll
在麒麟或统信UOS、Ubuntu上运行Oraycn.Demos.VideoChatMini.LinuxClient客户端
拷贝Oraycn.Demos.VideoChatMini.LinuxClient项目下的Debug文件夹,到麒麟或统信UOS、Ubuntu操作系统上,打开Debug -> netcoreapp3.1目录 ,在目录下打开终端,执行以下命令启动客户端
dotnet Oraycn.Demos.VideoChatMini.LinuxClient.dll
命令执行成功后,就会出现之前截图的客户端主界面。