Webcam Web 服务






4.30/5 (24投票s)
2002年4月24日
5分钟阅读

418508

11180
C++ ATL Web 服务,将从网络摄像头捕获的 JPEG 图片传递给 ActiveX 客户端
目录
引言
Webcam 是一个简单的对象访问协议 (SOAP) 项目,它允许客户端软件从 Web 服务获取由 Webcam 捕获的 JPEG 图片。这是我继使用 COM/DCOM 和 ATL 的几个项目后,在 SOAP 世界中的第一个实验性步骤。
项目分为三个部分:
- 服务器:Active Template Library 服务器,用于捕获 Webcam 的图像。
- Web 服务:由 Microsoft® 的 WSDL Generator 生成。
- 客户端:ActiveX 客户端,连接到 Webcam SOAP 服务器,获取图片并显示它们。
服务器
我们使用 Visual C++ 和 Active Template Library (ATL) 对象向导来创建一个简单的 COM 对象,名为 Camera
。它负责捕获图像和 JPEG 压缩。
JPEG 压缩是通过 Intel® JPEG Library v1.5 实现的。在这里 下载。您也可以使用其他库,例如 IJG JPEG LIBRARY,通过使用抽象基类 CPicturePacker
。
摄像头处理使用 Microsoft® Video for Windows® (VFW)。有关更多信息,请参阅 MSDN / Platform SDK Documentation / Graphics and Multimedia Services / Windows Multimedia / Video Capture。
技巧:VFW 需要一个窗口的句柄才能将摄像头驱动程序附加到上面。由于我们选择创建的是一个简单的 COM 对象,因此我们无法访问任何窗口句柄。调用 GetDesktopWindow()
为我们提供了一个。
// Don't have access to the container's window so just use the desktop. // RMK: If the desktop is not at least 24bits colors, then the grab will // fail HWND hWnd = ::GetDesktopWindow(); if ( hWnd ) { ...在
CWebCam
类中实现了在 Webcam 上捕获图像所需的所有功能。例如,GrabFrame
方法。bool CWebCam::GrabFrame( CPicturePacker * pPacker, unsigned char ** ppPackedPicture, unsigned long * pnPackedPictureBytes )使用
CPicturePacker
基类的引用来打包原始图片的比特,允许将打包扩展到您想要的任何格式,如前所述。在此示例中,我编写了 CIntelJpegPacker
类,它继承自 CPicturePacker
并使用 Intel® JPEG Library v1.5 来打包捕获的图片。您也可以考虑使用 GDI+ 来实现相同的功能。剩余的源代码与 COM 相关,没有什么特别之处。
服务器接口
我们的服务器需要完成两个简单的操作:从 Webcam 捕获图像并根据调用者定义的压缩比将其压缩为 JPEG 图片。这在 GrabFrame
方法中实现。
HRESULT GrabFrame( [in] short nQuality, [out, retval] SAFEARRAY(unsigned char) * ppGrabbedPicture );输入参数 '
nQuality
' 表示 JPEG 压缩比,范围从 1 到 99。值为 1 表示最低质量(最高压缩),值为 99 表示最高质量(最低压缩)。作为输出返回值,客户端将 JPEG 图片以
SAFEARRAY
of unsigned char
的形式接收。我们使用这种数据类型,因为它完全支持 SOAP(参见问题 1 和 2)。我们的 COM 对象支持
IErrorInfo
接口,由 ISupportErrorInfo
接口指示。它允许将服务器遇到的任何可能问题的信息发送回客户端。好处是我们完全自动化了这一点。有关此点的更多信息,请阅读 Microsoft SOAP User Guide:“Understanding the SOAP Fault <detail> Contents”。在编写接口之前,请查看“Data Type Mappings”中 SOAP 支持的各种类型及其在不同编程语言中的等价项。您可以在 Microsoft SOAP User Guide 中找到它们。
Web服务
我们简单地使用 Microsoft WSDL Generator 将我们的 COM 对象 Camera 包装成一个 SOAP Web 服务。
在欢迎页面上,单击“Next”。
在“Select the COM .dll to analyze”对话框中 输入您的 Web 服务的名称,例如 webcam。 浏览选择您的 dll。 单击“下一步”。 |
|
|
在“Select the services you would like to expose”对话框中 展开列表并选中 GrabFrame 方法。 单击“下一步”。
|
在“SOAP listener information”对话框中 在 URI 文本框中,键入您的 webservice 的 url,例如 https:///webservices/webcam。 选择 ISAPI Listener 类型。 然后选择 2001 作为 XSD Schema Namespace。 单击“下一步”。 |
|
![]() |
在“Specify the location for the new WSDL and WSML files”对话框中 选择 UTF-8 作为字符集。 然后选择您要存储新文件的位置,例如 c:\inetpub\WebServices\webcam。 单击“下一步”。 单击“完成”。
|
现在我们有了 Web 服务!您还必须在 IIS 中定义一个名为 WebServices 的虚拟目录。
如果您想更改 Web 服务的位置,则需要更改 Microsoft WSDL Generator 生成的 WSDL 文件。
客户端
我们使用 Visual C++ 和 Active Template Library (ATL) 对象向导创建了一个 ActiveX,名为 Webcam。这个 ActiveX 是 Webcam Web 服务的客户端部分。它连接到 Webcam Web 服务,接收 JPEG 图片并显示它。
要编译项目,您必须在计算机上安装 SOAP Toolkit。在此 处找到它。对于客户端,您还必须安装 WTL。如果未安装,请在此 处下载。
客户端接口
为了能够从 Webcam Web 服务捕获图像,我们需要指定 Web 服务的位置和压缩比。我们定义了这个接口。
HRESULT GrabFrame([in] BSTR strWeb ServiceURL, [in] short nQuality);
- 输入参数 'strWeb ServiceURL' 表示 Web 服务的 URL。
- 输入参数 'nQuality' 表示 JPEG 压缩比,范围从 1 到 99。值为 1 表示最低质量(最高压缩),值为 99 表示最高质量(最低压缩)。
如果出现错误,我们会在工具提示中显示它。我们使用 Windows Template Library (WTL) 来创建和显示工具提示。
测试
您可以在这个 页面上安装客户端 ActiveX 后测试此 Web 服务。
遇到的问题
- 当使用 ATL 的“Add Method to Interface”将“
GrabFrame
”方法添加到 Webcam Server 时,该方法已在 .idl 和 .h 文件中正确创建,但在 .cpp 文件中未创建。我们可以在 MSDN 上找到一种解释:Q198017。 - 在 SOAP SDK SP2 之前,
SAFEARRAY(unsigned char)
未得到正确处理。您需要 SP2 才能从SAFEARRAY(unisgned char)
正确地包装到 base64Binary。
历史
版本 1.00 | 2001 年 12 月 4 日 首次发布。 |