當前位置: 妍妍網 > 碼農

.NET + Avalonia 實作視訊聊天、遠端桌面

2024-03-04碼農


前言

現在最火的.NET跨平台UI框架莫過於Avalonia了。

Avalonia 基於.NET Core,因此它可以執行在任何支持.NET Core的平台上。

之前基於CPF跨平台UI框架寫過一個視訊聊天的demo,而現在看來Avalonia是大勢所趨,於是,我再寫一個Avalonia版本的Demo來供大家參考,它可以在Windows和Linux(包括國產OS,如銀河麒麟、統信UOS)上執行。

下圖是視訊聊天Demo的Avalonia客戶端在國產統信UOS上的執行的截圖:

一、功能介紹

客戶端登入成功後,執行的主界面如下圖所示:

1、視訊聊天

每個登入的使用者都可向其他任意線上使用者發送視訊聊天請求。

當收到來自其他線上使用者的視訊聊天邀請時,可接受或拒絕對方的請求。

當接受其他線上使用者的視訊聊天邀請時,即可開啟視訊聊天。

2、遠端桌面

每個登入的使用者都可向其他任意線上使用者發送遠端桌面請求;當對方未響應時,可主動取消遠端桌面請求。

當收到來自其他線上使用者請求控制桌面時,可接受或拒絕對方的請求。

當發送方收到其他線上使用者同意控制其電腦時,即可開啟遠端桌面連線。

被控端和主控端都可主動斷開遠端桌面連線。

二、開發環境

1、開發工具

Visual Studio 2022

2、開發框架

.NET Core 3.1

3、開發語言

C#

4、其它框架

Avalonia UI 框架(版本:0.10.22)、OMCS 語音視訊框架 (版本:8.0)

註: 建議 Avalonia 使用0.10.*的版本,精簡而且很穩定,而最新的11.0的版本太龐大了。

三、具體實作

下面我們講一下Demo中核心的程式碼實作,大家從文末下載源碼並對照著源碼看,會更清楚些。

1、自訂訊息型別 InformationTypes

publicstatic classInformationTypes
{
///<summary>
/// 視訊請求 0
///</summary>
publicconstint VideoRequest = 0;
///<summary>
/// 回復視訊請求的結果 1
///</summary>
publicconstint VideoResult = 1;
///<summary>
/// 通知對方 掛斷 視訊連線 2
///</summary>
publicconstint CloseVideo = 2;
///<summary>
/// 通知好友 網路原因,導致 視訊中斷 3
///</summary>
publicconstint NetReasonCloseVideo = 3;
///<summary>
/// 通知對方(忙線中) 掛斷 視訊連線 4
///</summary>
publicconstint BusyLine = 4;
///<summary>
/// 遠端桌面請求 5
///</summary>
publicconstint DesktopRequest = 5;
///<summary>
/// 回復遠端桌面請求的結果 6
///</summary>
publicconstint DesktopResult = 6;
///<summary>
/// 主動取消遠端桌面請求 7
///</summary>
publicconstint CancelDesktop = 7;
///<summary>
/// 對方(主人端)主動斷開遠端桌面 8
///</summary>
publicconstint OwnerCloseDesktop = 8;
///<summary>
/// 客人端斷開遠端桌面連線 9
///</summary>
publicconstint GuestCloseDesktop = 9;









2、發送視訊請求

1、當發起視訊聊天時,將顯示視訊聊天視窗

///<summary>
/// 開啟視訊通話視窗
///</summary>
///<param name="destID">對方ID</param>
///<param name="isWorking">false表示主動發起視訊通話邀請</param>
internalvoidOpenVideoChat(string destID,bool isWorking)
{
if (!this.VideoInvokeVerdict(destID))
{
return;
}
App.Multimedia.OutputAudio = true;
VideoChatWindow videoChatWindow = new VideoChatWindow(destID, isWorking);
videoChatWindow.EndTheCalled += VideoChatWindow_EndTheCalled;
objectManager.Add(destID, videoChatWindow);
videoChatWindow.Show();
}

2、連線自己的網路攝影機

publicVideoChatWindow(string destID,bool isWorking)
{
this.DestID = destID;
this.IsWorking = isWorking;
InitializeComponent();
//連線自己的網路攝影機
this.selfCamera.Core.DisplayVideoParameters = true;
this.selfCamera.Core.VideoDrawMode = VideoDrawMode.ScaleToFill;
this.selfCamera.BeginConnect(MainWindow.CurrentID);
this.Title = this.title.Text = this.RepeatedCallTip(false);
this.timer = new System.Timers.Timer();
this.timer.Interval = 1000;
this.timer.Elapsed += Timer_Elapsed;
if (IsWorking)

this.BeginConnect();
}
}

3、發送視訊通話請求

protectedoverridevoidOnInitialized()
{
base.OnInitialized(); 
this.SetWindowStats();
if (!this.IsWorking)
{
//向對方發起視訊通話邀請
VideoController.Singleton.SendMessage(this.DestID, InformationTypes.VideoRequest, null);
}
}
}

3、回復對方視訊請求

1、當收到對方的視訊聊天邀請時,將顯示視訊邀請視窗

2、發送回復視訊聊天請求訊息

protectedoverridevoidOnClosed(EventArgs e)
 {
base.OnClosed(e);
if (this.EndTheCalled != null)
{
this.EndTheCalled(this.DestID);
}
if (this.NotifyOther)
{
//回復對方的視訊通話請求
byte[] bytes = BitConverter.GetBytes(replyResult);
VideoController.Singleton.SendMessage(this.DestID, InformationTypes.VideoResult, bytes);
}
if (this.replyResult)
{
VideoController.Singleton.OpenVideoChat(DestID,true);
}
}

4、收到對方視訊請求的回復

///<summary>
/// 視訊通話,收到對方回復
///</summary>
internalvoidTargerReply(string destID, CommunicationStateType type)
{
ICommunicationAid aid = this.objectManager.Get(destID);
if(aid == null)
{
return;

switch (type)
{
case CommunicationStateType.Agree:
VideoChatWindow videoChatWindow = (VideoChatWindow)aid;
videoChatWindow.BeginConnect();
break;
case CommunicationStateType.Reject: 
aid.CloseWindow(false);
break;
case CommunicationStateType.HangUp: 
aid.CloseWindow(false);
break;
default:
break;
}
}

當對方回復同意時,將連線到對方的麥克風和網路攝影機,開始視訊聊天會話:

///<summary>
/// 連線對方裝置
///</summary>
internalvoidBeginConnect()
{
UiSafeInvoker.ActionOnUI(() =>
{
this.IsWorking = true;
this.Title = this.title.Text = this.RepeatedCallTip(false);
this.startTime = DateTime.Now;
this.timer.Start();
this.otherCamera.Core.DisplayVideoParameters = true;
this.otherCamera.Core.VideoDrawMode = VideoDrawMode.ScaleToFill;
this.otherCamera.Core.ConnectEnded += DynamicCameraConnector_ConnectEnded;
this.otherCamera.Core.Disconnected += DynamicCameraConnector_Disconnected;
this.microphoneConnector.ConnectEnded += MicrophoneConnector_ConnectEnded;
this.microphoneConnector.Disconnected += MicrophoneConnector_Disconnected;
this.otherCamera.BeginConnect(this.DestID);
this.microphoneConnector.BeginConnect(this.DestID);
this.NotifyOther = true;
});
}

5、實作遠端桌面

遠端桌面的請求/應答邏輯幾乎與視訊聊天請求/應答邏輯是一模一樣的。這裏就不再羅列響應的程式碼了。

1、當收到對方的遠端桌面控制請求時,將顯示請求視窗。

2、當同意對方的控制請求時,對方就可以控制請求方的電腦了。

四、源碼下載

1、.NET Core伺服端 + Avalonia客戶端

https://www.oraycn.com/DownLoadFiles/OMCS/VideoChatMini.Avalonia.rar

在Windows上部署執行伺服端和客戶端很容易,大家也都很熟悉了。下面講一下如何在Linux上部署執行這個視訊聊天程式的伺服端和客戶端。

2、在Linux上部署執行說明

在部署之前,需要在linux伺服端和客戶端上分別安裝 .Net core 3.1版本,命令列安裝命令如下:

yum install dotnet-sdk-3.1

檢查版本安裝情況

dotnet --version

執行

1、在CentOS上啟動VideoChatMini.ServerNetcore伺服端

拷貝Oraycn.VideoChatMini.ServerNetcore計畫下的Debug資料夾,到CentOS作業系統上,開啟Debug -> netcoreapp3.1目錄 ,在目錄下開啟終端,執行以下命令啟動伺服端

dotnet Oraycn.VideoChatMini.ServerNetcore.dll

2、在麒麟或統信UOS、Ubuntu上執行VideoChatMini.ClientAvalonia客戶端

拷貝Oraycn.VideoChatMini.ClientAvalonia計畫下的Debug資料夾,到麒麟或統信UOS、Ubuntu作業系統上,開啟Debug -> netcoreapp3.1目錄 ,在目錄下開啟終端,執行以下命令啟動客戶端

dotnet Oraycn.VideoChatMini.ClientAvalonia.dll

命令執行成功後,就會出現之前截圖的客戶端主界面。

總結

Avalonia 支持在X64和ARM64架構的Linux上執行,Demo的執行目錄下放的是X64架構的so,如果需要ARM64架構的so,可留下信箱獲取。

轉自:Linux音視訊開發

連結:cnblogs.com/shawshank/p/17761146.html

技術群: 添加小編微信並備註進群

小編微信:mm1552923

公眾號:dotNet編程大全