您的位置:首页 > 其它

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

2012-05-18 10:13 363 查看
本文将以最简单的方式展现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以及 demo源码

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

官方网站:http://oraycn.com

电话:027-87638960

Q Q:168757008

邮件:master@oraycn.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐