C# 实现 Linux 视频聊天、远程桌面(源码)

前言

之前文章有朋友在下载并了解了《C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)》中提供的源码后,留言给我说,这个视频会议有点复杂了,代码比较多,看得有些费劲。

问我能不能整个简单点的Demo,只要有视频聊天和远程桌面的功能就可以。于是,我就又写了一个Demo来供大家参考,它可以在Windows和Linux(包括国产OS,如银河麒麟、统信UOS、深度Deepin等)上运行。

下图是在银河麒麟V10上运行的截图

4840049c655e134a74a3b6c927632831.png

一、功能介绍

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
{
    /// <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、发送视频请求

发起视频聊天时,将显示视频聊天窗口

/// <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);
}

连接自己的摄像头并发送视频通话请求

/// <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、回复对方视频请求

当收到对方的视频聊天邀请时,将显示视频邀请窗口

ece324faf5c83e4570d782aae7566870.png

发送回复视频聊天请求消息

/// <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、实现远程桌面

远程桌面的请求/应答逻辑几乎与视频聊天请求/应答逻辑是一模一样的。这里就不再罗列响应的代码了。

当收到对方的远程桌面控制请求时,将显示请求窗口。

f93c1198400da800918d1188daabd61f.png

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

59b5e0968c899fe48488649333c0ebe6.png

四、源码下载

源码下载: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目录 ,在目录下打开终端,执行以下命令启动服务端

cd12fe952f3fafb40e13bfdef1c6597c.png
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

命令执行成功后,就会出现之前截图的客户端主界面。

转自:Shawshank

链接:cnblogs.com/shawshank/p/17420469.html

- EOF -

技术群:添加小编微信dotnet999

公众号:dotnet讲堂

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C表示程序设计语言中的一种高级编程语言。C语言由贝尔实验室的Dennis Ritchie在20世纪70年代早期开发出来。C语言具有简洁、高效、灵活等特点,成为一种广泛应用于系统编程和应用程序开发语言。 C语言的设计目标是提供一种能够通过简单而低级的方式来编写高效的程序的语言。C语言允许程序员直接访问和操作内存,提供了一系列的基本数据类型和控制结构,可以方便地编写各种程序。C语言还提供了丰富的函数库,可以用来处理字符串、文件、输入输出等各种操作。 C语言不仅仅是一种通用的编程语言,它还被广泛应用于嵌入式系统、操作系统、网络编程、图形图像处理、游戏开发等领域。由于C语言的高效性、灵活性以及与硬件的较好适配性,它被广泛认为是进行系统编程的首选语言。 C语言的语法相对简单,易于理解和学习,因此成为许多初学者的第一门编程语言。从C语言可以很容易地过渡到其他编程语言,例如C++、Java等,因为它们都在基于C语言的基础上进行了扩展和改良。 总而言之,C语言是一种广泛应用于系统编程和应用程序开发的高级编程语言。它具有简洁、高效、灵活等特点,被广泛认为是进行系统编程的首选语言。通过学习C语言,我们可以掌握程序设计的基础知识,并为以后学习其他编程语言打下良好的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值