`

VFW的封装类-摄像功能

 
阅读更多

在上一篇里,简单介绍了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.rar_VFW32.lib_Vfw.h-vfw32.lib_vfw avi_vfw.h_x264

    Vfw.h提供了所有必要的函数声明和数据结构定义,而vfw32.lib则包含了实现这些功能的代码,使得开发者可以在项目中链接到VFW的功能。 1. **Vfw.h**:这个头文件包含了VFW的所有函数和数据类型的声明。开发者在编写C...

    x264vfw----(32位+64位)---【x264vfw_full_44_2851bm_44825】

    x264vfw ,包含 32位 和64 位的,只要在安装时,32位 和 64位 都勾选,即可! 我是在会声会影X10中来使用的。亲测可用。

    eNSP防火墙6000V-vfw-usg.rar

    eNSP防火墙6000V资源包

    vfw.rar_VFW-camera_vfw_vfw CSharp_摄像 录像_摄像头 录像

    这个标题中的“vfw.rar_VFW-camera_vfw_vfw CSharp_摄像 录像_摄像头 录像”指的是一个关于VFW的C#类库,它能够帮助开发者利用VFW技术来操控摄像头进行视频录制和截图操作。 VFW的核心在于提供了一套标准的接口,...

    山石防火墙SG6000-VFW01-5.5R1B11.iso安装镜像

    山石防火墙SG6000-VFW01-5.5R1B11.iso安装镜像

    vFW-2000 H3C虚拟防火墙镜像

    vFW-2000 H3C虚拟防火墙镜像

    vfw.rar_VFW-camera_vfw_vfw 摄像头_视频录制

    VFW的核心功能包括视频捕获、播放、编辑和压缩。在描述中提到的"只有基本功能,可以添加"意味着这个实例可能只实现了视频捕获和保存的基本流程,但开发者可以根据需求扩展其功能,比如添加视频编码、特效处理或网络...

    VFW-video.rar_vfw_视频捕捉

    VFW的核心功能包括: 1. **视频捕获**:通过连接到系统上的视频输入设备(如摄像头),VFW可以实时捕获视频流,并将其转换为数字格式。 2. **视频回放**:VFW支持播放已经捕获或存储的视频文件,处理各种视频编码...

    VFW-USB摄像头测试

    VFW(Video for Windows)是微软在Windows操作系统上提供的一种视频处理框架,它为开发者提供了在应用程序中集成视频捕获、处理和播放功能的接口。在这个“VFW-USB摄像头测试”项目中,我们主要关注如何利用VFW驱动...

    个人收集的十几个VFW视频采集代码

    你可以通过重载这些类的方法,如`OnPaint()`,来实现VFW视频的实时显示。 4. **VFW视频采集流程** - 打开设备:使用`capCreateCaptureWindow`函数创建一个捕获窗口,然后使用`capSetCaptureWindow`设置捕获窗口的...

    VFW-Video.rar_vfw

    VFW的核心功能主要包括以下几个方面: 1. **视频捕捉**:VFW提供了一系列的函数和结构,用于与硬件设备(如摄像头)交互,实现视频流的实时捕捉。例如,`capCreateCaptureWindow`函数可以创建一个用于视频捕捉的...

    vfw.rar_Delphi VfW_vfw_vfw 摄像头_vfw DELPHI

    "vfw.rar_Delphi VfW_vfw_vfw 摄像头_vfw DELPHI" 这个标题表明我们关注的是一个与Delphi编程相关的资源,具体是关于Video for Windows (VFW)库的使用,特别是涉及到摄像头的捕获功能。"VfW"是Windows操作系统提供的...

    H3C NFV虚拟化产品 汇总集【VSR1000 VSR2000 VFW1000 VLB1000】.rar

    H3C NFV虚拟化产品 汇总集【VSR1000 VSR2000 VFW1000 VLB1000】,vmware添加虚拟机即用,含手册

    VFW实例.rar_delphi image_vfw delphi_vfw DELPHI_vfw 录像_vfw.pas del

    5. 录像功能:VFW API提供了录像功能,可能通过`capRecord`或`capSetCallbackOnFrame`函数实现录制视频,同时可以设置录制的编码器和参数。 6. 结束捕获和释放资源:使用`capStop`停止捕获,`capReleaseCapture`...

    VC+VFW双摄像头程序

    VC+VFW双摄像头程序 VC+VFW双摄像头程序 VC+VFW双摄像头程序 说明一下: 程序打开的时候,会让你选择摄像头的,有两次选择,两次选一样的话就只能看到一下画面了,选不一样的才能同时看到两个画面

    VFW_CAP.rar_VFW c builder_VFW interface _Vfw cap

    "Vfw cap" 指的是利用VFW进行视频捕获(capture)的功能。 首先,我们要理解VFW的核心组件——Video Capture设备。这些设备通常包括摄像头或者数字视频摄录机,它们能够捕捉实时视频流并将其提供给软件处理。在C++...

    基于VFW的视频预览

    VFW 提供了简单易用的接口,使得开发者可以方便地访问Windows系统底层的多媒体功能,包括视频捕获、播放和编辑等。 VFW 是微软在Windows 95和Windows NT 4.0时代推出的一个API,它是DirectShow的前身。尽管现在...

    VFW.pas_Delphi版VFW SDK

    这个转换使得Delphi开发者能够利用VFW SDK的功能来创建多媒体应用,而无需借助其他编程语言或进行复杂的接口封装。 VFW.pas中包含了一系列的类型定义、常量声明、函数和过程,这些都对应于原始的vfw.h文件中的内容...

    利用VFW视频录像及拍照

    在本项目中,我们将讨论如何在VC++环境下利用VFW来实现视频录像和拍照功能。 1. **VFW基础概念** - **视频框架**:VFW提供了一个基于消息驱动的框架,开发者可以通过消息循环来控制视频的播放、捕获等操作。 - **...

    VFW_Caputure用VFW实现摄像头频采集.功能比较基础

    VFW(Video for Windows)是微软在Windows操作系统上提供的一套API,用于处理视频和音频数据,包括捕获、编辑和播放等功能。本项目“VFW_Caputure”旨在利用VFW来实现摄像头视频的采集,尽管其功能相对基础,但仍然...

Global site tag (gtag.js) - Google Analytics