• 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
        {
            /// 
                    /// 视频请求 0
            /// 
            public const int VideoRequest = 0;
    
            /// 
                    /// 回复视频请求的结果 1
            /// 
            public const int VideoResult = 1;
    
            /// 
                    /// 通知对方 挂断 视频连接 2
            /// 
            public const int CloseVideo = 2;
    
            /// 
            /// 通知好友 网络原因,导致 视频中断 3
            /// 
            public const int NetReasonCloseVideo = 3;
    
            /// 
            /// 通知对方(忙线中) 挂断 视频连接 4
            /// 
            public const int BusyLine = 4;
    
            /// 
                    /// 远程桌面请求 5
            /// 
            public const int DesktopRequest = 5;
    
            /// 
                    /// 回复远程桌面请求的结果 6
            /// 
            public const int DesktopResult = 6;
    
            /// 
                    ///  主动取消远程桌面请求 7
            /// 
            public const int CancelDesktop = 7;
    
            /// 
                    ///  对方(主人端)主动断开远程桌面 8
            /// 
            public const int OwnerCloseDesktop = 8;
    
            /// 
                    /// 客人端断开远程桌面连接 9
            /// 
            public const int GuestCloseDesktop = 9;
        } 
    复制代码

    2. 发送视频请求

    (1)当发起视频聊天时,将显示视频聊天窗口  

    复制代码
    /// 
    /// 显示视频聊天窗口
    /// 
    /// 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);
    }
    复制代码

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

    复制代码
    /// 
    /// 发送视频通话请求
    /// 
    /// 是否为发送者
    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)发送回复视频聊天请求消息

    复制代码
    /// 
    /// 是否同意视频聊天请求
    /// 
    /// 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. 实现远程桌面

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

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

       

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

             

    四.源码下载

         源码下载:(若点击没有自动下载,可右键另存为) 

         服务端+PC端:VideoChatMini.rar  

             Android 端:VideoChatMini.Android.rar

                  Web 端:VideoChatMini.Web.rar (需要安装 OMCS Web 插件 )

    1. 源码项目说明

         下载【服务端+PC端】源码压缩包,解压后,可以用 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

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

            安卓端的运行界面也差不多,这里就不截图了,大家可以下载源码自行运行测试。

            谢谢!

  • 相关阅读:
    马斯克震撼演讲:我想创立一个新世界
    OpenGL之窗口的创建
    数据库-DQL
    申请newBing后使用edge浏览器检索时“重定向次数过多”,导致无法正常使用
    黑*头条_第2章_文章列表前端成形与后端变身
    大二一个学期学这么点内容,没有概念,只有实操
    C语言从文本到执行程序的过程(预编译,编译,汇编)
    Perforce 使用建议
    fuzz——AFL基础使用方法
    如何解决Servlet异常:深入解析`NumberFormatException`
  • 原文地址:https://www.cnblogs.com/shawshank/p/17420469.html