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实例。关于更多多媒体服务器的描述可以参见多媒体服务器。服务端运行起来后,如下图所示:

        

二.客户端

 首先,我们需要构造并初始化多媒体设备管理器。如果要设置一些配置参数,可以在调用初始化方法之前通过设置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客户端的开发细节的描述可以参见开发手册的多媒体设备管理器多媒体连接器

 三.下载

      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)测试白板时,需要连接到同一个用户的白板,才能协同。

 

-----------------------------------------------------------------------------------------------------------------------------------------------  

另,如果您有录制语音视频的需求,可以了解一下我们的MFile组件

 

下载免费版本的OMCS以及 demo源码

阅读 更多OMCS开发手册系列文章

Q Q:168757008

官网:www.oraycn.com

导航

首页

官方网站

立即咨询 

站内搜索

ESFramework 通信框架

详细说明

SDK下载

ESFramework FAQ

版本变更记录

OMCS 语音视频框架

详细说明

SDK下载

OMCS FAQ

版本变更记录

OrayTalk 企业即时通讯系统

详细说明

客户端下载

傲瑞实用组件

SDK下载

NPush 消息推送组件

StriveEngine 轻量级的通信引擎

MFile 语音视频录制组件

MCapture 语音视频采集组件

MPlayer 语音视频播放组件

OAUS 自动升级系统

傲瑞组件 FAQ

授权

授权流程

产品授权说明

产品选购指南

授权SDK使用说明

其它

SDK使用技巧

联系我们

电话:027-87638960

Q Q:168757008

邮件:master@oraycn.com