OMCS Demo -- 视频、音频、电子白板、远程桌面 功能基本展现(附源码)

       本文将以最简单的方式展现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) -- 多媒体服务器。服务端运行起来后,如下图所示:

      OMCS Demo -- 视频、音频、电子白板、远程桌面 功能基本展现(附源码)_第1张图片  

二.客户端

      首先,我们需要构造并初始化多媒体设备管理器。如果要设置一些配置参数,可以在调用初始化方法之前通过设置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 Demo -- 视频、音频、电子白板、远程桌面 功能基本展现(附源码)_第2张图片

      界面上的各个按钮,用于演示OMCS提供的各个多媒体连接器的功能。我们以视讯功能为例,当摄像头和话筒的checkbox都勾选上时,点击视讯按钮,表示同时连接到目标用户(可以是当前登录者自己)的摄像头和话筒设备。视讯按钮被点击后,将弹出ChatForm。

      OMCS Demo -- 视频、音频、电子白板、远程桌面 功能基本展现(附源码)_第3张图片

      在定义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以及 demo源码

关于OMCS的任何问题,欢迎联系我们:   

电话:027-87638960   

Q Q:168757008 

你可能感兴趣的:(demo)