在上一篇里,简单介绍了windows VFW库的情况,使用VFW处理还是比较简单的,但是也非常不容易控制,而且,即便仔细看文档的介绍,还是要摸着石头过河。
在CodeForge网站上搜了好长时间,总算从网上找到一个以前人写的 VFWImage的工具类,算是完整封装了VFW的宏和API,于是我把我的项目中,和图像、视频采集的程序使用这个类重写了,重写之后,的确控制起来方便多了。
现在把这个类附上,有需要的朋友可以直接下载来使用,使用方式以后慢慢贴上来吧。
使用这个类,可以非常简单,做到在一个窗口(可以是对话框或各类控件)中显示采集到的活动图像,在用户选择“拍照”时,用上一篇博文中的保存JPG的方法,即可保存为JPG图片。
视频的录制稍微麻烦一些,普通的做法,使用VFW 宏,支持直接保存视频文件,但是只支持AVI(太大了),即便设置的压缩和品质很低,15秒还是能达到10M~20M,受不了。最可恶的是,调用VFW录制时,还会向C盘根目录下写一个视频文件??!!
这里我想了一个办法,也许是笨办法,希望朋友们能有以教我一些更好的方法。
不开启VFW的保存视频功能,只打开活动图像的预览。
启动一个线程,在线程中,一张一张采集图像,将图像写入AVI(虽然还是AVI,但是经过处理,不会太大)
从开始采集起始,开始录音,视频采集完成,停止录音,录音写入WAV
将AVI和WAV合成新的AVI
直接上示例:
HWND hWnd=pDlg->m_VFWImageProc.GetCapWindow(); CString myfname("e:\\new12222.avi"); HDC hDisplayDC = GetDC(hWnd); CAVI Avi; CString csPathName; CString csTempPath; //没有声音的AVI以及声音WAV保存在临时目录 TCHAR * pTempPath = csTempPath.GetBufferSetLength(MAX_PATH + 1); GetTempPath(MAX_PATH + 1,pTempPath); csTempPath.ReleaseBuffer(); TCHAR * pTempFile = csPathName.GetBufferSetLength(MAX_PATH + 1); GetTempFileName(csTempPath,_T("FRC"),0,pTempFile); csPathName.ReleaseBuffer(); CFileStatus FileStatus; if (CFile::GetStatus(csPathName,FileStatus)) CFile::Remove(csPathName); csPathName.Replace(_T(".tmp"),_T(".wav")); CString cswavFile = csPathName; //视频每秒的帧数 // Open for recording Avi.Open(10); // Setup capturing the screen int cxWidth = 0;//GetSystemMetrics(SM_CXVIRTUALSCREEN); int cyHeight = 0;//GetSystemMetrics(SM_CYVIRTUALSCREEN); RECT rr; ::GetWindowRect( hWnd,&rr); cxWidth = rr.right-rr.left; cyHeight = rr.bottom-rr.top; CRect DIBRect = CRect(0,0,cxWidth,cyHeight); // Device dependent bitmap CDIBFrame DIB(0,0,8); DIB.Init(cxWidth,cyHeight); //录音 MCIDEVICEID id=0; MCI_OPEN_PARMS open; open.lpstrDeviceType=(LPCSTR)MCI_DEVTYPE_WAVEFORM_AUDIO; open.lpstrElementName=_T(""); open.wDeviceID=id; mciSendCommand(NULL,MCI_OPEN,MCI_WAIT|MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID |MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&open); id=open.wDeviceID; MCI_RECORD_PARMS record; mciSendCommand(id,MCI_RECORD,NULL,(DWORD)(LPVOID)&record); //开始图像采集 int frames=0; //for (int iFrame = 1;iFrame <= 150;++iFrame) //外部在需要时停止录制 while( !stopped ) { // Capture the desktop BitBlt(DIB,0,0,DIBRect.Width(),DIBRect.Height (),hDisplayDC,DIBRect.left,DIBRect.top,SRCCOPY); // Add a frame Avi.AddFrame(DIB); //每隔100毫秒采集1此,也就是每秒10帧 Sleep(100); frames++; } CString filename; MCI_SAVE_PARMS save; save.lpfilename=cswavFile;// "e:\\t1111.wav";// cswavFile;//_T( fname+"_wav.wav" ); mciSendCommand(id,MCI_SAVE,MCI_SAVE_FILE|MCI_WAIT,(DWORD)(LPVOID)&save); mciSendCommand(id,MCI_CLOSE,NULL,NULL); CString csaviFile = Avi.Close(); // Delete the dc's ReleaseDC(hWnd,hDisplayDC); 合并AVI和WAV Merge_Video_And_Sound_File( csaviFile,cswavFile, myfname ); |
大体上就是这样,其中使用到了一个CAVI的类,如果有需要的情给我留言,留下邮箱即可。
相关推荐
Vfw.h提供了所有必要的函数声明和数据结构定义,而vfw32.lib则包含了实现这些功能的代码,使得开发者可以在项目中链接到VFW的功能。 1. **Vfw.h**:这个头文件包含了VFW的所有函数和数据类型的声明。开发者在编写C...
x264vfw ,包含 32位 和64 位的,只要在安装时,32位 和 64位 都勾选,即可! 我是在会声会影X10中来使用的。亲测可用。
eNSP防火墙6000V资源包
这个标题中的“vfw.rar_VFW-camera_vfw_vfw CSharp_摄像 录像_摄像头 录像”指的是一个关于VFW的C#类库,它能够帮助开发者利用VFW技术来操控摄像头进行视频录制和截图操作。 VFW的核心在于提供了一套标准的接口,...
山石防火墙SG6000-VFW01-5.5R1B11.iso安装镜像
vFW-2000 H3C虚拟防火墙镜像
VFW的核心功能包括视频捕获、播放、编辑和压缩。在描述中提到的"只有基本功能,可以添加"意味着这个实例可能只实现了视频捕获和保存的基本流程,但开发者可以根据需求扩展其功能,比如添加视频编码、特效处理或网络...
VFW的核心功能包括: 1. **视频捕获**:通过连接到系统上的视频输入设备(如摄像头),VFW可以实时捕获视频流,并将其转换为数字格式。 2. **视频回放**:VFW支持播放已经捕获或存储的视频文件,处理各种视频编码...
VFW(Video for Windows)是微软在Windows操作系统上提供的一种视频处理框架,它为开发者提供了在应用程序中集成视频捕获、处理和播放功能的接口。在这个“VFW-USB摄像头测试”项目中,我们主要关注如何利用VFW驱动...
你可以通过重载这些类的方法,如`OnPaint()`,来实现VFW视频的实时显示。 4. **VFW视频采集流程** - 打开设备:使用`capCreateCaptureWindow`函数创建一个捕获窗口,然后使用`capSetCaptureWindow`设置捕获窗口的...
VFW的核心功能主要包括以下几个方面: 1. **视频捕捉**:VFW提供了一系列的函数和结构,用于与硬件设备(如摄像头)交互,实现视频流的实时捕捉。例如,`capCreateCaptureWindow`函数可以创建一个用于视频捕捉的...
"vfw.rar_Delphi VfW_vfw_vfw 摄像头_vfw DELPHI" 这个标题表明我们关注的是一个与Delphi编程相关的资源,具体是关于Video for Windows (VFW)库的使用,特别是涉及到摄像头的捕获功能。"VfW"是Windows操作系统提供的...
H3C NFV虚拟化产品 汇总集【VSR1000 VSR2000 VFW1000 VLB1000】,vmware添加虚拟机即用,含手册
5. 录像功能:VFW API提供了录像功能,可能通过`capRecord`或`capSetCallbackOnFrame`函数实现录制视频,同时可以设置录制的编码器和参数。 6. 结束捕获和释放资源:使用`capStop`停止捕获,`capReleaseCapture`...
VC+VFW双摄像头程序 VC+VFW双摄像头程序 VC+VFW双摄像头程序 说明一下: 程序打开的时候,会让你选择摄像头的,有两次选择,两次选一样的话就只能看到一下画面了,选不一样的才能同时看到两个画面
"Vfw cap" 指的是利用VFW进行视频捕获(capture)的功能。 首先,我们要理解VFW的核心组件——Video Capture设备。这些设备通常包括摄像头或者数字视频摄录机,它们能够捕捉实时视频流并将其提供给软件处理。在C++...
VFW 提供了简单易用的接口,使得开发者可以方便地访问Windows系统底层的多媒体功能,包括视频捕获、播放和编辑等。 VFW 是微软在Windows 95和Windows NT 4.0时代推出的一个API,它是DirectShow的前身。尽管现在...
这个转换使得Delphi开发者能够利用VFW SDK的功能来创建多媒体应用,而无需借助其他编程语言或进行复杂的接口封装。 VFW.pas中包含了一系列的类型定义、常量声明、函数和过程,这些都对应于原始的vfw.h文件中的内容...
在本项目中,我们将讨论如何在VC++环境下利用VFW来实现视频录像和拍照功能。 1. **VFW基础概念** - **视频框架**:VFW提供了一个基于消息驱动的框架,开发者可以通过消息循环来控制视频的播放、捕获等操作。 - **...
VFW(Video for Windows)是微软在Windows操作系统上提供的一套API,用于处理视频和音频数据,包括捕获、编辑和播放等功能。本项目“VFW_Caputure”旨在利用VFW来实现摄像头视频的采集,尽管其功能相对基础,但仍然...