谈谈使用VFW在windows下编程控制摄像头【孙涛】 |
如要转贴请注明转至blog.csdn.net/suntaoznz。谢谢! 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; DWORD dwSize;
dwSize = capGetVideoFormatSize(hWndC); lpbi = GlobalAllocPtr (GHND, dwSize); capGetVideoFormat(hWndC, lpbi, dwSize);
// 访问视频格式,并且释放分配的内存。
应用程序使用capSetVideoFormat宏(WM_CAP_SET_VIDEOFORMAT),把一个BITMAPINFO结构发送给捕获窗口,显示修改。因为视频格式由设备指定的,你的应用程序可以去检查获得的返回值,来知道这个视频格式是不是公开的。
3.2.8预览视频下面使用capPreviewRate宏来设置预览模式的帧频率为66毫秒/帧,使用capPreview宏在捕获窗口预览图像。
capPreviewRate(hWndC, 66); // 速度,微秒
capPreview(hWndC, TRUE); // 开始预览
capPreview(hWnd, FALSE); // 屏蔽预览
3.2.9允许视频覆盖(Overlay)
下面使用capDriverGetCaps宏去检测这个捕获驱动是否支持覆盖(Overlay)模式,如果支持,就允许视频覆盖模式;
CAPDRIVERCAPS CapDrvCaps; capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS)); if (CapDrvCaps.fHasOverlay) capOverlay(hWndC, TRUE);
3.2.10捕获文件命名
下例使用capFileSetCaptureFile宏来指定一个要命名的文件名(mycap.avi),使用capFileAlloc宏去预分配5MB的文件。
char szCaptureFile[] = "MYCAP.AVI"; capFileSetCaptureFile( hWndC, szCaptureFile); capFileAlloc( hWndC, (1024L * 1024L * 5));
3.2.11格式化音频捕获
下例使用capSetAudioFormat来设置音频格式为11-KHz PCM 8-bit,立体声。
WAVEFORMATEX wfex; wfex.wFormatTag = WAVE_FORMAT_PCM; wfex.nChannels = 2; // 使用立体声 wfex.nSamplesPerSec = 11025; wfex.nAvgBytesPerSec = 22050; wfex.nBlockAlign = 2; wfex.wBitsPerSample = 8; wfex.cbSize = 0; capSetAudioFormat(hWndC, &wfex, sizeof(WAVEFORMATEX));
|
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240813180353098-2140851696.jpg)