最近做的一个Web版的视频会议项目,需要在网页中播放来自远程摄像头采集的实时视频,我们已经有了播放远程实时视频的使用C#编写的windows控件,如何将其嵌入到网页中去了?这需要使用一种古老的技术,ActiveX。
1.将.Net控件转化为ActiveX控件
首先要做的就是将我们的windows视频播放控件转化为ActiveX控件。先看看我们视频播放控件的定义,其基于OMCS实现,相当简单:
[csharp]
public partial class CameraVideoPlayer : UserControl
{
private IMultimediaManager 易做图Manager;
public CameraVideoPlayer()
{
InitializeComponent();
}
public void Test()
{
Random ran = new Random();
string userID = "bb" + ran.Next(1001,9999).ToString();
this.Initialize("223.4.*.*", 9900, userID, "aa01");
}
public void Initialize(string serverIP, int port, string userID, string targetUserID)
{
try
{
this.易做图Manager = MultimediaManagerFactory.GetSingleton();
this.易做图Manager.Initialize(userID, "", serverIP, port);
this.cameraConnector1.BeginConnect(targetUserID);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
}
}
当调用其Initialize方法时,将连接到目标用户的摄像头,并在其内含的cameraConnector1控件上播放视频。这个控件在Windows Form应用程序中工作良好,现在我们一步步来将其转换为ActiveX控件。
(1)GUID
ActiveX控件首先是COM组件,COM组件有唯一的GUID。后面我们可以看到,在Web中,需要通过GUID定位并加载已经注册的ActiveX控件。
如果使用的是VS2010,工具菜单下有个“创建GUID”菜单,点击它可以创建一个新的GUID,然后把其复制作为CameraVideoPlayer的特性:
[csharp]
[Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]
public partial class CameraVideoPlayer : UserControl
(2)实现IObjectSafety接口
当ActiveX控件在浏览器中调用的时候,往往会出现警告框,提示不安全的控件正在运行。这是由浏览器安全策略所限定的,控件通过实现IObjectSafety接口以向浏览器表明自己是合法的。在项目中增加IObjectSafety接口的定义:
[csharp]
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), Inte易做图ceType(ComInte易做图ceType.Inte易做图ceIsIUnknown)]
public inte易做图ce IObjectSafety
{
void GetInte易做图cceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions);
void SetInte易做图ceSafetyOptions(System.Int32 riid, System.Int32 dwOptionsSetMask, System.Int32 dwEnabledOptions);
}
并让CameraVideoPlayer实现这个接口:
[csharp]
[Guid("D9906B42-56B3-4B94-B4F9-A767194A382F")]
public partial class CameraVideoPlayer : UserControl, IObjectSafety
{
private IMultimediaManager 易做图Manager;
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.易做图Manager = MultimediaManagerFactory.GetSingleton();
this.易做图Manager.Initialize(userID, "", serverIP, port);
this.cameraConnector1.BeginConnect(targetUserID);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
}
public void GetInte易做图cceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
{
pdwSupportedOptions = 1;
pdwEnabledOptions = 2;
}
public void SetInte易做图ceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
{
}
}
IObjectSafety接口的两个方法的实现都可以采用上面的代码来做。
(3)程序集设定
接下来,我们需要对控件的程序集(OMCS_ActiveX)做一个设置,以表明其将作为一个COM组件使用。打开AssemblyInfo.cs文件,首先将ComVisible特性设置为true。其次,增加AllowPartiallyTrustedCallers特性。如下所示:
[csharp]
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assembly: ComVisible(true)]
[assembly: AllowPartiallyTrustedCallers()]
最后,在项目属性的“生成”页中,将“为COM互操作注册”的CheckBox勾上。
这样,编译生成的产物中除了OMCS_ActiveX.dll外,还有OMCS_ActiveX.tlb(COM用到的类型库文件)。
2.制作安装程序