最近做的一个Web版的视频会议项目,需要在网页中播放来自远程摄像头采集的实时视频,我们已经有了播放远程实时视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,ActiveX。

1.将.Net控件转化为ActiveX控件

首先要做的就是将我们的windows视频播放控件转化为ActiveX控件。先看看我们视频播放控件的定义,其基于OMCS实现,相当简单:

  1. public partial class CameraVideoPlayer : UserControl
  2. {
  3. private IMultimediaManager multimediaManager;
  4. public CameraVideoPlayer()
  5. {
  6. InitializeComponent();
  7. }
  8. public void Test()
  9. {
  10. Random ran = new Random();
  11. string userID = "bb" + ran.Next(1001,9999).ToString();
  12. this.Initialize("223.4.*.*", 9900, userID, "aa01");
  13. }
  14. public void Initialize(string serverIP, int port, string userID, string targetUserID)
  15. {
  16. try
  17. {
  18. this.multimediaManager = MultimediaManagerFactory.GetSingleton();
  19. this.multimediaManager.Initialize(userID, "", serverIP, port);
  20. this.cameraConnector1.BeginConnect(targetUserID);
  21. }
  22. catch (Exception ee)
  23. {
  24. MessageBox.Show(ee.Message);
  25. }
  26. }

当调用其Initialize方法时,将连接到目标用户的摄像头,并在其内含的cameraConnector1控件上播放视频。这个控件在Windows Form应用程序中工作良好,现在我们一步步来将其转换为ActiveX控件。

(1)GUID

ActiveX控件首先是COM组件,COM组件有唯一的GUID。后面我们可以看到,在Web中,需要通过GUID定位并加载已经注册的ActiveX控件。

如果使用的是VS2010,工具菜单下有个“创建GUID”菜单,点击它可以创建一个新的GUID,然后把其复制作为CameraVideoPlayer的特性:

  1. [Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]
  2. public partial class CameraVideoPlayer : UserControl

(2)实现IObjectSafety接口

当ActiveX控件在浏览器中调用的时候,往往会出现警告框,提示不安全的控件正在运行。这是由浏览器安全策略所限定的,控件通过实现IObjectSafety接口以向浏览器表明自己是合法的。在项目中增加IObjectSafety接口的定义:

  1. [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  2. public interface IObjectSafety
  3. {
  4. void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions);
  5. void SetInterfaceSafetyOptions(System.Int32 riid, System.Int32 dwOptionsSetMask, System.Int32 dwEnabledOptions);
  6. }

并让CameraVideoPlayer实现这个接口:


[Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]  
public partial class CameraVideoPlayer : UserControl, IObjectSafety  
{  
    private IMultimediaManager multimediaManager;  
    public CameraVideoPlayer()  
    {  
        InitializeComponent();  
    }  
  
    public void Test()  
    {  
        Random ran = new Random();  
        string userID = "bb" + ran.Next(1001,9999).ToString();  
        this.Initialize("223.4.180.116", 9900, userID, "aa01");  
    }  
  
    public void Initialize(string serverIP, int port, string userID, string targetUserID)  
    {  
        try  
        {  
            this.multimediaManager = MultimediaManagerFactory.GetSingleton();  
            this.multimediaManager.Initialize(userID, "", serverIP, port);  
            this.cameraConnector1.BeginConnect(targetUserID);  
        }  
        catch (Exception ee)  
        {  
            MessageBox.Show(ee.Message);  
        }  
  
    }  
  
    public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)  
    {  
        pdwSupportedOptions = 1;  
        pdwEnabledOptions = 2;  
    }  
  
    public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)  
    {  
  
    }  
}  

IObjectSafety接口的两个方法的实现都可以采用上面的代码来做。

(3)程序集设定

接下来,我们需要对控件的程序集(OMCS_ActiveX)做一个设置,以表明其将作为一个COM组件使用。打开AssemblyInfo.cs文件,首先将ComVisible特性设置为true。其次,增加AllowPartiallyTrustedCallers特性。如下所示:

  1. // 将 ComVisible 设置为 false 使此程序集中的类型
  2. // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
  3. // 则将该类型上的 ComVisible 特性设置为 true。
  4. [assembly: ComVisible(true)]
  5. [assembly: AllowPartiallyTrustedCallers()]

最后,在项目属性的“生成”页中,将“为COM互操作注册”的CheckBox勾上。

这样,编译生成的产物中除了OMCS_ActiveX.dll外,还有OMCS_ActiveX.tlb(COM用到的类型库文件)。

2.制作安装程序

转化后的CameraVideoPlayer ActiveX控件会被部署在IIS服务器上,用户第一次打开网页时,在用户的机器上是不存在这个控件的,所以,需要下载安装并在用户的机器上注册该ActiveX控件。这些可以通过VS自带的制作安装程序的功能来实现,也相当简单。

(1)在当前解决方案中添加一个新的安装项目。

(2)将OMCS_ActiveX项目的主输出导入到安装项目的“应用程序文件夹”下面。

(3)修改主输出的文件安装属性中的Register项为vsdrpCOM。

(4)设置安装项目的项目属性,主要是“安装URL”项,要设置为部署时地址。

(5)如果需要,将“系统必备”中的一些项目勾上或去掉。

(6)编译安装项目,将会生成两个文件setup.exe、Setup1.msi。将它们拷贝到网站虚拟目录的根目录下。

3.Web集成

现在我们写一个最简单的HTML来试试加载视频播放的ActiveX控件CameraVideoPlayer。如下所示:


<html xmlns="http://www.w3.org/1999/xhtml" >  
<head>  
    <title>摄像头视频播放器测试</title>  
</head>  
<body>  
<form id="form1">  
       <table>  
  <tr>  
   <td align="center">  
    <object id="cameraVideoPlayer"   
    <strong> classid="clsid:{D9906B42-56B3-4B94-B4F9-A767194A382F}" codebase="setup.exe"</strong> width="320" height="240">   
    </object>  
   </td>  
  </tr>  
  <tr>  
   <td align="center">  
    <input type=button id="Button1" value="连接摄像头" onclick="javascript:doTest()"/>  
  </td>  
</tr>  
</table>   
  
<script type="text/javascript">  
function doTest()  
{  
  var obj = document.getElementById("cameraVideoPlayer");   
  obj.Test();  
}  
</script>  
</form>  
    </body>   
</html>            注意加粗的部分,说明了两点:

(1)浏览器是通过GUID来定位ActiveX控件的。

(2)如果本机不存在目标ActiveX控件,则自动下载codebase属性指示的安装程序进行安装。

将HTML文件部署好后,第一次打开网页,如下所示:

运行安装,完成后,页面会刷新,并可以看到ActiveX控件已经成功加载进来了。然后,点击“连接摄像头”按钮,测试一下ActiveX控件是否可以显示远程摄像头采集的视频,如下所示:

这样,嵌入到网页中的ActiveX控件就像普通的windows控件一样正常运行了:)

在web中使用windows控件,实现摄像头功能的更多相关文章

  1. 在Web中使用Windows控件

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] 将Net控件转化为ActiveX控件 1GUID 2实现IObjectSafety接口 3程序集设定 制作安装程序 Web集 ...

  2. HTML5 Web app开发工具Kendo UI Web中Grid网格控件的使用

    Kendo UI Web中的Grid控件不仅可以显示数据,并对数据提供了丰富的支持,包括分页.排序.分组.选择等,同时还有着大量的配置选项.使用Kendo DataSource组件,可以绑定到本地的J ...

  3. 在DevExpress中使用CameraControl控件进行摄像头图像采集

    在我们以前的项目了,做摄像头的图片采集,我们一般还是需要做一个封装处理的,在较新版本的DevExpress控件里面,增加了一个CameraControl控件,可以直接调用摄像头显示的,因此也可以做头像 ...

  4. 12-22C#公共控件(基本功能)

    在C#窗体中,公共控件的基本功能: 1.获取.设置控件的参数值: 2.事件(其实是一种特殊的方法和属性,当被其他外力触发它,就会发生,类似数据库的触发器.) 下面是基本的公共控件: 1.复选框 1)设 ...

  5. 在Web中如何使用Windows控件(ActiveX)[转]

    最近做的一个Web项目,需要在网页中播放摄像头采集的实时视频,我们已经有了播放视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,ActiveX. 1.将.Ne ...

  6. 向ArcGIS的ToolBarControl中添加任意的windows控件的方法

    概要:在使用ArcEngine开发中,给ToolbarControl添加按钮形式的命令项相信大家都很熟悉了,因为网上的例子很多.但这种使用click调用功能的方式只能满足大部分用户在体验方面的需求,除 ...

  7. C# windows服务:C#windows服务中的Timer控件的使用

    C# windows服务程序中的Timer控件的使用问题是如何解决的呢? 今天和同事一起研究了下C# windows服务程序中的Timer控件的使用的写法. 我们在建立一个C# windows服务程序 ...

  8. 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

    Dixon 原文  用ArcGIS Engine.VS .NET和Windows控件开发GIS应用     此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署 ...

  9. Ti IPNC Web网页之ActiveX控件

    Ti IPNC Web网页之ActiveX控件 本篇介绍关于TI IPNC网页中播放器相关的东西. gStudio工程中添加播放器并控制播放器 打开IPNC网页时首先会自动下载ActiveX控件并安装 ...

随机推荐

  1. ApplicationContextAware 接口

    一.这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以 ...

  2. Web之路笔记之二 - CSS Positioning

    CSS中控制各个Block element的位置方式之一,tag为position,有4种属性. 1. static 一般网页默认的属性,表示element根据页面正常流(normal flow)进行 ...

  3. Web之路笔记之一

    简单说一句,现在开始准备面试前端的知识,每天完成相关的任务,记录一些点. 2014秋季学期Web2.0课程习题 <Lab1 - About Me Page> 目标是自己动手写一个粗略的包含 ...

  4. discuz被别人评论一段代码,然后页面就变样了

                ۣۣۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖ ...

  5. Java IO教程

    1  Java IO 教程 2 Java IO 概述 3 Java IO: 文件 4 Java IO: 管道 5 Java IO: 网络 6 Java IO: 字节和字符数组 7 Java IO: S ...

  6. Jquery想说爱你不容易

    JQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作.由John Resig在2006年1月的BarCamp NYC上发布第一个版本.目前是由 Dave M ...

  7. uva 820(最大流)

    最大流的裸题,直接贴了模板. #include <cstdio> #include <iostream> #include <sstream> #include & ...

  8. python 筛选股票

    x[0] = '0' or x[0]='6' or x[0]='3' len(x)=6 x.isdigit() *但是有的债券也是6位 *比如010007.IB

  9. jquery中链式调用原理

    (1).链式调用 $("#mybtn").css("width","100px") .css("height",&quo ...

  10. java 调用 scala

    1 scala 方法的输入输出不能有 jdk 不可识别的类型(如:Int,Float,Any 等是不行的,Unit 对应到 void 是可以的.) http://rwh.readthedocs.org ...