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)當同意對方的控制請求時,對方就可以控制請求方的電腦了。
四.源碼下載
源碼下載:(若點擊沒有自動下載,可右鍵另存為)
服務端+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
命令執行成功后,就會出現之前截圖的客戶端主界面。
安卓端的運行界面也差不多,這里就不截圖了,大家可以下載源碼自行運行測試。
謝謝!

浙公網安備 33010602011771號