OMCS开发手册(04) -- 二次开发流程

时间:2022-10-20 09:17:15

在掌握了前面几篇关于OMCS的详细介绍后,我们就可以正式基于OMCS进行二次开发了。下面我们就从服务端和客户端的角度分别介绍开发的步骤。

一.服务端开发

抛开具体的业务逻辑而言,就OMCS的服务端的开发而言相当简单。步骤如下所示:

(1)下载  OMCS多媒体服务器(带源码)

(2)使用VS打开OMCS.Server项目,修改其中的DefaultUserVerifier类的实现,为VerifyUser方法添加验证客户端用户帐号密码的逻辑。

(3)如果需要使用自定义的主窗体,则实现它。

(4)更改配置文件App.config中的相关配置。

(5)发布项目,部署并运行。

就像OMCS开发手册(00) -- 概述一文中描述的,OMCS多媒体服务器和实现业务逻辑的应用服务器是相互独立的。

我们也可以在OMCS服务器进程中,集成具体的业务逻辑,将两个进程合并为一个。但是我们并不推荐这样做,因为当负载增加时,还是需要将它们分开部署的;而且,分开部署还有一个好处就是避免它们之间相互干扰。

二.客户端开发

相对于OMCS服务器端,客户端开发要稍微复杂一些。

(1)在项目中添加对OMCS.dll、PaintFramework.dll、ESBasic.dll的引用。

(2)将OMCS的连接器组件/控件添加到工具箱中:在VS的工具箱的空白地方右键快捷菜单 => 选择项,在弹出的“选择工具箱项”的窗体上,点击“浏览”按钮,选中OMCS.dll文件,再点击“确定”。

(3)开始编码,调用MultimediaManagerFactory的静态方法GetSingleton获取多媒体管理器单件实例,设置多媒体管理器的属性,并调用其Initialize方法完成初始化。比如:

OMCS开发手册(04) -- 二次开发流程
    IMultimediaManager multimediaManager = MultimediaManagerFactory.GetSingleton();
    multimediaManager.ChannelMode = ChannelMode.P2PChannelFirst;
    multimediaManager.SecurityLogEnabled = false;
    multimediaManager.CameraDeviceIndex = 0;
    multimediaManager.MicrophoneDeviceIndex = 0;
    multimediaManager.SpeakerIndex = 0;
multimediaManager.DesktopEncodeQuality = 3; multimediaManager.Initialize("aa01","pwd", "192.168.0.98", 9900);
OMCS开发手册(04) -- 二次开发流程

(4)预定multimediaManager的ConnectionInterrupted、ConnectionRebuildSucceed事件,以实时监控多媒体管理器与多媒体服务器之间的TCP连接的状态。

OMCS开发手册(04) -- 二次开发流程
        multimediaManager.ConnectionInterrupted += new CbGeneric(multimediaManager_ConnectionInterrupted);
        multimediaManager.ConnectionRebuildSucceed += new CbGeneric(multimediaManager_ConnectionRebuildSucceed);

        void multimediaManager_ConnectionInterrupted()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new CbSimple(this.multimediaManager_ConnectionInterrupted), null);
            }
            else
            {
                this.toolStripLabel_state.Text = "连接状态:断开";
                this.toolStripLabel_state.ForeColor = Color.Red;
            }
        }

        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;
            }
        }
OMCS开发手册(04) -- 二次开发流程

(5)将连接器组件从工具箱拖到您的窗体或控件的表面。

(6)调用连接器的BeginConnect方法连接到目标多媒体设备,并预定其ConnectEnded事件,以获取连接是否成功的结果。

(7)预定连接器的Disconnected事件,当连接器的连接断开时获取通知并做相关的处理。比如:

OMCS开发手册(04) -- 二次开发流程
        this.cameraConnector1.ConnectEnded += new CbGeneric<ConnectResult>(cameraConnector1_ConnectEnded);
        this.cameraConnector1.Disconnected += new CbGeneric<ConnectorDisconnectedType>(cameraConnector1_Disconnected);

        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 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);
            }
        }
OMCS开发手册(04) -- 二次开发流程

(8)当业务逻辑需要挂断连接器,或宿主窗体将被关闭时,需要调用连接器的Disconnect方法,以主动断开到目标多媒体设备的连接。最后还要释放连接器对象。比如:

        private void ChatForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.cameraConnector1.Disconnect();
            this.cameraConnector1.Dispose();
        }  

本文介绍的只是使用OMCS的最基本开发流程,关于如何更好地使用OMCS的各个特性来构建我们的网络多媒体应用,请参考后面即将退出的“OMCS使用技巧”类的文章。

OMCS开发手册(04) -- 二次开发流程的更多相关文章

  1. 阿里巴巴 Java 开发手册(二): 常量定义

    1. [强制]不允许任何魔法值(即未经定义的常量)直接出现在代码中. 反例: String key = "Id#taobao_" + tradeId; cache.put(key, ...

  2. &lbrack;Intel Edison开发板&rsqb; 04、Edison开发基于nodejs和redis的服务器搭建

    一.前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程.该工程是基于nodejs和redis写成的一个简单的工 ...

  3. 1&comma;下载和部署开发环境--AutoCAD二次开发

    环境需求为: AutoCAD 2020版 ObjectARX SDK 下载地址:https://www.autodesk.com/developer-network/platform-technolo ...

  4. PHP开发搭建环境二:开发工具PhpStorm安装、激活以及配置

    关于php的开发工具很多,目前市面上最好用最强大的莫过于PhpStorm这款开发神器了,但是鉴于很多开发者朋友在网站上下载的PhpStorm开发工具不能用,或者使用起来很不方便,笔者把最好用的下载地址 ...

  5. Android流媒体开发之路二&colon;NDK开发Android端RTMP直播推流程序

    NDK开发Android端RTMP直播推流程序 经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行 ...

  6. python开发初期及二次开发C api

    1,python2 or python 区别, https://wiki.python.org/moin/Python2orPython3 python software foundation 2,p ...

  7. 2&comma;手动创建CAD二次开发项目--AutoCAD二次开发(2020版)

    本项目使用手动创建,意为不使用SDK模板. 从Visual Studio的“文件”下拉菜单中,选择“新建”->“项目...”. 在出现的“新建项目”对话框的“项目类型:”树中,单击“ Visua ...

  8. Java开发最佳实践&lpar;二&rpar; ——《Java开发手册》之&quot&semi;异常处理、MySQL 数据库&quot&semi;

    二.异常日志 (一) 异常处理 (二) 日志规约 三.单元测试 四.安全规约 五.MySQL数据库 (一) 建表规约 (二) 索引规约 (三) SQL语句 (四) ORM映射 六.工程结构 七.设计规 ...

  9. 最好最实用的二次开发教程 cms

    ◆二次开发 什么是二次开发? 二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能和效果,一 般来说都不会改变原有系统的内核. 为什么要二次开发? 随着信息化技术的不断 ...

  10. 阿里JAVA开发手册零度的思考理解&lpar;一&rpar;

    转载请注明原创出处,谢谢! 缘由 阿里JAVA开发手册已经发表有很长时间了,值得认真研究思考推广 阿里官方的Java代码规范标准,这份开发手册不仅规范了一些开发细节,也提出了很多工程开发的哲学,值得好 ...

随机推荐

  1. Log4net在类库中的用法

    app.config应当放置在解决方案的根目录下.具体流程如下: 第一步:应该下载log4net.dll并引入到你的项目中,下载见附件 第二步:需要配置相关的配置文件App.config或Web.co ...

  2. ivy,ivyde插件-eclipse

    官方共享更新磁盘下载 http://www.apache.org/dist/ant/ivyde/updatesite/ http://ant.apache.org/ivy/download.cgi 简 ...

  3. linux rm 命令

    1.命令格式: rm [选项] 文件… 2.命令功能: 删除一个目录中的一个或多个文件或目录,如果没有使用- r选项,则rm不会删除目录.如果使用 rm 来删除文件,通常仍可以将该文件恢复原状. 3. ...

  4. 【网络编程】之十二、wsaeventselect&plus;线程池 服务器实现

    #include<WinSock2.h> #include<iostream> using namespace std; #pragma comment(lib, " ...

  5. CF 136A Presents

    http://codeforces.com/problemset/problem/136/A 题意 :就是输入很多数字,第 i 个数字 pi 代表着第 i 个人的礼物给了第 pi 个人,而让你输出的数 ...

  6. shopnc 商城源码阅读笔记-缓存技术

    缓存方式 : 从 shopnc 的缓存驱动目录 /framework/cache里已有的实现类来看,shopnc支持以下5种缓存方式 apc Eaccelerator file memcache xc ...

  7. DBA 经典面试题&lpar;4&rpar;

    1.如果信息采集管理系统(ICM)崩溃了怎么办?  答案:所有其他的管理器都会继续工作.ICM只会处理队列控制请求,意思是开启和关闭其他并发的管理器.    2.你如何加速打补丁的过程?    答案: ...

  8. 关于Platinum库的MediaRender具体C&plus;&plus;代码实现探讨

    接上篇博文 NDK下 将Platinum SDK 编译成so库 (android - upnp) 讲述了如何利用该代码库编译给android程序调用的so库,其中也提到了,在使用sample-upnp ...

  9. css背景图片充满DIV

    最近接手前端页面,让给调样式.哥纯粹一个代码程序猿,表示那些个样式应该让前端人员或者美工小妹妹来实现. 书归正传,碰到了问题,页面要在手机上展现,众所周知,手机在中国的牌子很多,很难做到统一. 页面上 ...

  10. ios 逆向编程(环境搭建)

    首先如果你想要逆向其他的APP 动态的查看 或者修改人家APP里面的东西 1, 首先要有一台越狱的手机 最好是9.1以下的,因为9.2以上(包括9.2)就不能完美越狱了 2,手机也要5s以上的(因为从 ...