OMCS Demo -- 入门Demo:语音视频、电子白板、远程桌面 功能展现(PC、Android、iOS、Web,支持国产OS)
初次接触OMCS可看视频:OMCS基础概念介绍
本Demo视频讲解可观看:OMCS入门Demo源码讲解视频
本文将以最简单的方式展现OMCS提供的视频、音频、电子白板、远程桌面等功能。OMCS采用的是典型的C/S结构,所以,即使是最简单的demo,我们也需要服务端和客户端。
一.服务端
正如二次开发流程一文描述的,服务端的开发非常简单,我们只需要实现IUserVerifier接口,以验证客户端登录用户的帐号和密码。在本demo中,OMCS.Demos.Simplest.Server项目的UserVerifier实现就假设所有的登录都直接通过。
public class UserVerifier : IUserVerifier { public bool VerifyUser(string userID, string password) { return true; } }
接下来,在Program.cs文件中,将UserVerifier对象注入到MultimediaServer的构造函数,除此之外,还要将OMCS配置信息一起作为构造参数传入:
Program.MultimediaServer = new MultimediaServer(int.Parse(ConfigurationManager.AppSettings["Port"]), userVerifier, config,
bool.Parse(ConfigurationManager.AppSettings["SecurityLogEnabled"]),null);
最后,我们使用OMCS提供的默认的服务端主窗体来显示相关状态信息:
ServerForm form = new ServerForm (Program.MultimediaServer); Application.Run(form);
至此,服务端的开发就完成了,可以看到服务端最核心的就是要构造多媒体服务器MultimediaServer实例。关于更多多媒体服务器的描述可以参见多媒体服务器。服务端运行起来后,如下图所示:
OMCS客户端支持.NET、Android、iOS等平台,下面我们以.NET的PC客户端为例进行说明,对于其它平台,使用方法几乎是完全一样的。 首先,我们需要构造并初始化多媒体设备管理器。如果要设置一些配置参数,可以在调用初始化方法之前通过设置IMultimediaManager的相关属性来完成。 接下来,我们定义了一个简单的客户端主界面MainWindow用于调用OMCS提供的各个功能。在MainWindow的Initialize方法中,我们预定了客户端连接状态的变化事件,以在界面上正确的显示当前连接的状态: MainForm运行起来后,界面如下所示:
界面上的各个按钮,用于演示OMCS提供的各个多媒体连接器的功能。我们以视讯功能为例,当摄像头和话筒的checkbox都勾选上时,点击视讯按钮,表示同时连接到目标用户(可以是当前登录者自己)的摄像头和话筒设备。视讯按钮被点击后,将弹出ChatWindow。
在定义ChatWindow时,我们向其xaml文件上使用了一个WpfCameraPanel控件作为存放视频图像的容器。 在ChatWindow构造函数中,我们分别定义了CameraConnector和MicrophoneConnector连接器用于连接目标用户的摄像头和话筒,并预定了CameraConnector和MicrophoneConnector的连接结束事件和连接断开事件,并调用了它们的BeginConnect方法以开始连接目标设备。二.客户端
IMultimediaManager multimediaManager = MultimediaManagerFactory.GetSingleton();
multimediaManager.CameraDeviceIndex = 0;
multimediaManager.MicrophoneDeviceIndex = 0;
multimediaManager.ChannelMode= ChannelMode.P2PDisabled;
multimediaManager.Initialize(id,"", ConfigurationManager.AppSettings["ServerIP"], int.Parse(ConfigurationManager.AppSettings["ServerPort"]));
public void Initialize(string currentUserID, IMultimediaManager mgr)
{
this.userID = currentUserID;
this.multimediaManager = mgr;
// 预定与OMCS服务器的连接断开、重连成功事件
this.multimediaManager.ConnectionInterrupted += multimediaManager_ConnectionInterrupted;
this.multimediaManager.ConnectionRebuildSucceed += multimediaManager_ConnectionRebuildSucceed;
this.toolStripLabel_loginfo.Text = string.Format("当前登录:{0}", this.userID);
this.toolStripLabel_state.Text = "连接状态:正常";
}
//与OMCS服务器网络连接断开
void multimediaManager_ConnectionInterrupted(IPEndPoint ipe)
{
UiSafeInvoker.ActionOnUI(() =>
{
this.toolStripLabel_state.Text = "连接状态:断开";
this.toolStripLabel_state.Foreground = Brushes.Red;
});
}
//重连OMCS服务器并重登录成功
void multimediaManager_ConnectionRebuildSucceed(IPEndPoint ipe)
{
UiSafeInvoker.ActionOnUI(() =>
{
this.toolStripLabel_state.Text = "连接状态:正常(重连成功)";
this.toolStripLabel_state.Foreground = Brushes.Black;
});
}
//定义视频连接器和音频连接器 DynamicCameraConnector dynamicCameraConnector = new DynamicCameraConnector(); MicrophoneConnector microphoneConnector = new MicrophoneConnector(); private string friendID; public ChatWindow(string currentUserID, string _friendID, bool camera, bool microphone) { InitializeComponent(); this.friendID = _friendID; this.Title = string.Format("正在与{0}连接中...", _friendID); //视频图像显示到页面 this.dynamicCameraConnector.SetViewer(this.cameraPanel); //预定连接器的连接结束和连接断开事件 this.dynamicCameraConnector.ConnectEnded += cameraConnector1_ConnectEnded; this.dynamicCameraConnector.Disconnected += cameraConnector1_Disconnected; this.microphoneConnector.ConnectEnded += microphoneConnector1_ConnectEnded; this.microphoneConnector.Disconnected += microphoneConnector1_Disconnected; this.dynamicCameraConnector.GetCurrentImage(); if (camera) { this.dynamicCameraConnector.BeginConnect(this.friendID); } if (microphone) { this.microphoneConnector.BeginConnect(this.friendID); } } void cameraConnector1_ConnectEnded(string ownerID, ConnectResult result) { //显示视频连接结果 UiSafeInvoker.ActionOnUI(() => { this.textBlock_camera.Text = string.Format("视频:{0}", result == ConnectResult.Succeed ? "正常" : result.ToString()); }); } void microphoneConnector1_ConnectEnded(string ownerID, ConnectResult result) { //显示音频连接结果 UiSafeInvoker.ActionOnUI(() => { this.textBlock_microphone.Text = string.Format("音频:{0}", result == ConnectResult.Succeed ? "正常" : result.ToString()); }); } void cameraConnector1_Disconnected(string ownerID, ConnectorDisconnectedType connectorDisconnectedType) { UiSafeInvoker.ActionOnUI(() => { this.textBlock_microphone.Text = string.Format("视频:断开,{0}", connectorDisconnectedType); }); } void microphoneConnector1_Disconnected(string ownerID, ConnectorDisconnectedType connectorDisconnectedType) { UiSafeInvoker.ActionOnUI(() => { this.textBlock_microphone.Text = string.Format("音频:断开,{0}", connectorDisconnectedType); }); }
电子白板和远程桌面也是类似的流程,这里就不赘述了。关于更多OMCS客户端的开发细节的描述可以参见开发手册的多媒体设备管理器和多媒体连接器。
三. 如何部署测试Demo ?
1. 运行Demo进行测试时,请注意:
(1)将服务端部署到一台服务器上,然后启动OMCS.Server.exe。
(2)修改客户端配置文件中的服务器的IP,在一台机器(或手机)上启动客户端,登录一个帐号,比如aa01.
(3)在另一台机器(或手机)上启动客户端,登录另一个帐号,比如aa02.
(4)aa01可以在主界面的TextBox中中输入aa02,并点击后面的按钮,来连接aa02的视频。
(5)aa02也可以在其UI中输入aa01,并点击后面的按钮,来连接aa01的视频。这样可以演示视频聊天的功能了。
(6)测试视讯时,两个客户端最好在不同的房间,以防止声音相互干扰。
(7)测试白板时,需要连接到同一个用户的白板,才能协同。
2. 测试手机端(安卓端、iOS端)时,要特别注意一下:
在登录成功之后,会进入如下界面:
由于安卓/iOS端要先进入摄像头预览界面启动摄像头之后,别人才可以成功地连到手机的摄像头,所以点击“语音视频”按钮会进入摄像头预览界面:
手机端进入这个预览界面之后,别人才能连接它的摄像头的。此时也可以点击“开始连接对方”,才正式开始连接对方的摄像头。
3. 测试Web版
关于OMCS入门Demo Web版的详细介绍请参见: OMCS Demo -- 入门Demo Web 版
四.Demo源码下载
(1)服务端(Win/Linux) + Win客户端 + Linux客户端 + Web端:OMCS.Demos.Simplest.rar
(2)Avalonia 客户端:OMCS.ClientDemoAvalonia.rar
注: Linux 客户端和 Avalonia 客户端内置的是x86/x64非托管so库,若需要其它架构的so,请联系我们免费获取。
(3)Android 客户端:OMCS.AndroidDemo.rar
(4)iOS 客户端:OMCS.IOSDemo.zip
(5)C++ 客户端:OMCS入门Demo源码之Qt版
(6)uniapp 客户端:utsOMCS.rar
注:如果要在 uniapp 中使用 OMCS.Android.jar 包,可以用自定义基座的方式引入jar包,然后用 UTS插件 的方式去调用。
-----------------------------------------------------------------------------------------------------------------------------------------------
阅读 更多OMCS开发手册系列文章 。
Q Q:168757008
官网: www.oraycn.com