使用视屏捕获
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.2使用视频捕获
3.2.1创建捕获窗体
下面的例子通过使用capCreateCaptureWindow函数来创建一个捕获窗体hWndC = capCreateCaptureWindow (
(LPSTR) "My Capture Window", // 如果是Pop-up窗口的窗口名称
WS_CHILD | WS_VISIBLE, // 窗口类型
0, 0, 160, 120, // 窗口位置和尺寸
(HWND) hwndParent,
(int) nID /* child ID */);
3.2.2连接到一个捕获驱动器
下面举例,如何通过捕获窗口的句柄hWndC连接到MS VIDEO驱动程序上,同时还演示了如何断开连接。使用capDriverDisconnect:
fOK = SendMessage (hWndC, WM_CAP_DRIVER_CONNECT, 0, 0L);
// 或者使用宏连接:
// fOK = capDriverConnect(hWndC, 0);
// 关闭连接
capDriverDisconnect (hWndC);
3.2.3列举安装的捕获驱动程序
使用capGetDriverDescription函数来获得系统已经安装的所有捕获驱动程序的名称和版本。
char szDeviceName[80];
char szDeviceVersion[80];
for (wIndex = 0; wIndex < 10; wIndex++)
{
if (capGetDriverDescription (wIndex, szDeviceName,
sizeof (szDeviceName), szDeviceVersion,
sizeof (szDeviceVersion))
{
// 加入名字到一个已经安装的设备列表中
// 让用户选择一个使用。
}
}
3.2.4获得捕获驱动器的性能参数
WM_CAP_DRIVER_GET_CAPS消息可以返回捕获驱动程序以及其硬件的性能参数。这些信息存放在一个CAPDRIVERCAPS的数据结构中。当你的应用程序的捕获窗口连接到一个新的捕获驱动器后,都会刷新这个CAPDRIVERCAPS数据结构。下面将使用capDriverGetCaps宏来获得捕获设备的性能参数。
CAPDRIVERCAPS CapDrvCaps;
SendMessage (hWndC, WM_CAP_DRIVER_GET_CAPS,
sizeof (CAPDRIVERCAPS), (LONG) (LPVOID) &CapDrvCaps);
// 或者,使用宏来获得驱动器的新能参数
// capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS));
3.2.5获得捕获窗口状态(Status)
下面例子使用SetWindowPos函数区设置捕获窗口的尺寸,这个尺寸的大小是基于输入的视频流大小的。输入视频流的尺寸大小由capGetStatus宏来获得,获得信息放在一个CAPSTATUS的数据结构体中。
CAPSTATUS CapStatus;
capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS));
SetWindowPos(hWndC, NULL, 0, 0, CapStatus.uiImageWidth,
CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
3.2.6显示对话框区设置视频属性
每个捕获驱动器都可以提高3个以上的不同对话框来控制数字视频的特性和捕获处理。下面的例子示范如何显示这些对话框。在显示每个对话框前,该例会调用capDriverGetCaps宏并且检查返回的CAPDRIVERCAPS对象来查看是否可以能够显示特定的对话框。
CAPDRIVERCAPS CapDrvCaps;
capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS));
// 视频源对话框
if (CapDriverCaps.fHasDlgVideoSource)
capDlgVideoSource(hWndC);
// 视频格式对话框
if (CapDriverCaps.fHasDlgVideoFormat)
{
capDlgVideoFormat(hWndC);
// 是否由新的图像尺寸?Are there new image dimensions?
capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS));
// 如果有,发送通知给父窗口,告诉它尺寸改变了
}
// 视频显示对话框
if (CapDriverCaps.fHasDlgVideoDisplay)
capDlgVideoDisplay(hWndC);
3.2.7获得和设定视频格式
BITMAPINFO数据结构体可以实现长度可调节地去适应标准压缩的数据格式。因为它的长度可以变,所以在每次获得当前视频格式前,都必须去查询这个结构的长度以及分配的内存大小。该例子使用了capGetVideoFormatSize宏去获得缓存区大小,使用capGetVideoFormat宏区获得当前视频格式。
LPBITMAPINFO lpbi;