本文将以最简单的方式展现OMCS提供的视频、音频、电子白板、远程桌面等功能。OMCS采用的是典型的C/S结构,所以,即使是最简单的demo,我们也需要服务端和客户端。
正如OMCS开发手册(04) -- 二次开发流程一文描述的,服务端的开发非常简单,我们只需要实现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提供的默认的服务端主窗体来显示相关状态信息:
MainServerForm form =Program.MultimediaServer.CreateMainServerForm(bool.Parse(ConfigurationManager.AppSettings["ShowUserList"])); form.Text = "傲瑞多媒体服务器 V1.0"; Application.Run(form);
至此,服务端的开发就完成了,可以看到服务端最核心的就是要构造多媒体服务器MultimediaServer实例。关于更多多媒体服务器的描述可以参见OMCS开发手册(03) -- 多媒体服务器。服务端运行起来后,如下图所示:
首先,我们需要构造并初始化多媒体设备管理器。如果要设置一些配置参数,可以在调用初始化方法之前通过设置IMultimediaManager的相关属性来完成。
IMultimediaManager multimediaManager = MultimediaManagerFactory.GetSingleton(); multimediaManager.CameraDeviceIndex = 0; multimediaManager.MicrophoneDeviceIndex = 0; multimediaManager.P2PChannelEnabled = true; multimediaManager.Initialize(loginForm.CurrentUserID,"", ConfigurationManager.AppSettings["ServerIP"], int.Parse(ConfigurationManager.AppSettings["ServerPort"]));
接下来,我们定义了一个简单的客户端主界面MainForm用于调用OMCS提供的各个功能。在MainForm的Initialize方法中,我们预定了客户端连接状态的变化事件,以在界面上正确的显示当前连接的状态:
public void Initialize(IMultimediaManager mgr, string currentUserID) { this.userID = currentUserID; this.multimediaManager = mgr; //预定与OMCS服务器的连接断开、重连成功事件 this.multimediaManager.ConnectionInterrupted += new CbGeneric(multimediaManager_ConnectionInterrupted); this.multimediaManager.ConnectionRebuildSucceed += new CbGeneric(multimediaManager_ConnectionRebuildSucceed); this.toolStripLabel_loginfo.Text = string.Format("当前登录:{0}", this.userID); this.toolStripLabel_state.Text = "连接状态:正常"; } #region multimediaManager_ConnectionRebuildSucceed void multimediaManager_ConnectionRebuildSucceed() { if (this.InvokeRequired) { this.Invoke(new CbSimple(this.multimediaManager_ConnectionRebuildSucceed), null); } else { this.toolStripLabel_state.Text = "连接状态:正常(重连成功)"; this.toolStripLabel_state.ForeColor = Color.Black; } } #endregion #region multimediaManager_ConnectionInterrupted void multimediaManager_ConnectionInterrupted() { if (this.InvokeRequired) { this.Invoke(new CbSimple(this.multimediaManager_ConnectionInterrupted), null); } else { this.toolStripLabel_state.Text = "连接状态:断开"; this.toolStripLabel_state.ForeColor =.Red; } } #endregion
MainForm运行起来后,界面如下所示:
界面上的各个按钮,用于演示OMCS提供的各个多媒体连接器的功能。我们以视讯功能为例,当摄像头和话筒的checkbox都勾选上时,点击视讯按钮,表示同时连接到目标用户(可以是当前登录者自己)的摄像头和话筒设备。视讯按钮被点击后,将弹出ChatForm。
在定义ChatForm时,我们向其UI上拖放了一个CameraConnector控件、一个MicrophoneConnector组件、以及一个通道信号强度显示组件ChannelQualityDisplayer。CameraConnector和MicrophoneConnector连接器分别用于连接目标用户的摄像头和话筒,而ChannelQualityDisplayer用于显示对方到自己这个方向的通道的质量好坏。
在ChatForm构造函数中,我们分别预定了CameraConnector和MicrophoneConnector的连接结束事件和连接断开事件,并调用了它们的BeginConnect方法以开始连接目标设备。
public ChatForm(string currentUserID, string _friendID ,bool camera ,bool microphone) { InitializeComponent(); this.friendID = _friendID; this.Text = string.Format("{0}...", _friendID); //初始化信号强度显示控件 this.channelQualityDisplayer1.Initialize(this.friendID, MultimediaManagerFactory.GetSingleton().Monitor); //预定连接器的连接结束和连接断开事件 this.cameraConnector1.ConnectEnded += new CbGeneric<ConnectResult>(cameraConnector1_ConnectEnded); this.cameraConnector1.Disconnected += new CbGeneric<ConnectorDisconnectedType>(cameraConnector1_Disconnected); this.microphoneConnector1.ConnectEnded += new CbGeneric<ConnectResult>(microphoneConnector1_ConnectEnded); this.microphoneConnector1.Disconnected += new CbGeneric<ConnectorDisconnectedType>(microphoneConnector1_Disconnected); if (camera) { this.cameraConnector1.BeginConnect(this.friendID); } if (microphone) { this.microphoneConnector1.BeginConnect(this.friendID); } } void cameraConnector1_ConnectEnded(ConnectResult result) { if (this.InvokeRequired) { this.BeginInvoke(new CbGeneric<ConnectResult>(this.cameraConnector1_ConnectEnded), result); } else { //显示视频连接结果 this.label_camera.Text = string.Format("视频:{0}", result == ConnectResult.Succeed ? "正常" : result.ToString()); } } void microphoneConnector1_ConnectEnded(ConnectResult result) { if (this.InvokeRequired) { this.BeginInvoke(new CbGeneric<ConnectResult>(this.microphoneConnector1_ConnectEnded), result); } else { //显示音频连接结果 this.label_microphone.Text = string.Format("音频:{0}", result == ConnectResult.Succeed ? "正常" : result.ToString()); } } void cameraConnector1_Disconnected(ConnectorDisconnectedType connectorDisconnectedType) { if (this.InvokeRequired) { this.BeginInvoke(new CbGeneric<ConnectorDisconnectedType>(this.cameraConnector1_Disconnected), connectorDisconnectedType); } else { this.label_camera.Text = string.Format("视频:断开,{0}", connectorDisconnectedType); } } void microphoneConnector1_Disconnected(ConnectorDisconnectedType connectorDisconnectedType) { if (this.InvokeRequired) { this.BeginInvoke(new CbGeneric<ConnectorDisconnectedType>(this.microphoneConnector1_Disconnected), connectorDisconnectedType); } else { this.label_microphone.Text = string.Format("音频:断开,{0}", connectorDisconnectedType); } }
最后,在直接关闭ChatForm的时候,需要主动断开连接器并释放连接器对象。
private void ChatForm_FormClosing(object sender, FormClosingEventArgs e) { this.cameraConnector1.Disconnect(); this.cameraConnector1.Dispose(); this.microphoneConnector1.Disconnect(); this.microphoneConnector1.Dispose(); }
电子白板和远程桌面也是类似的流程,这里就不赘述了。关于更多OMCS客户端的开发细节的描述可以参见OMCS开发手册(01) -- 多媒体设备管理器和OMCS开发手册(02) -- 多媒体连接器。
Demo源码:OMCS.Demos.Simplest.rar
运行Demo进行测试时,请注意:
(1)将服务端部署到一台服务器上,然后启动OMCS.Server.exe。
(2)修改客户端配置文件中的服务器的IP,在一台机器上启动客户端,登录一个帐号,比如aa01.
(3)在另一台机器上启动客户端,登录另一个帐号,比如aa02.
(4)aa01可以在主界面的TextBox中中输入aa02,并点击后面的按钮,来连接aa02的视频。
(5)aa02也可以在其UI中输入aa01,并点击后面的按钮,来连接aa01的视频。这样可以演示视频聊天的功能了。
(6)测试视讯时,两个客户端最好在不同的房间,以防止声音相互干扰。
(7)测试白板时,需要连接到同一个用户的白板,才能协同。
阅读 更多OMCS开发手册系列文章。
-----------------------------------------------------------------------------------------------------------------------------------------------
关于OMCS的任何问题,欢迎联系我们:
电话:027-87638960
Q Q:168757008