ImageVerifierCode 换一换
格式:DOC , 页数:369 ,大小:3.99MB ,
资源ID:9313918      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9313918.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(Visual-C--视频技术方案宝典.doc)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Visual-C--视频技术方案宝典.doc

1、 第二章 视频采集方案 视频采集是开发视频监控系统的首要步骤,它关系到采集视频数据的质量,因此,视频采集会影响到其后的各种操作(包括视频预览、视频录像、视频回放、图像识别等)。本章将从VFW(Video For Windows,Windows视频)、DirectShow和SDK(Software Development Kit,软件开发包) 3个方面介绍视频采集的解决方案。 2.1  视频采集方案分析 在开发视频监控系统时,通常有3种视频采集的方法。分别为VFW、DirectShow和SDK。其中,VFW是一种较老的视频采集方法,它是Microsoft提供的数字视频软件包,提供了一组库

2、函数,能够实现视频捕捉、影像压缩及影像播放等功能。使用VFW的优点是它随从Windows操作系统一起安装,可执行文件不需要附带额外的库文件就可以运行,但是许多监控卡不支持VFW,因此,在开发专业的监控系统时很少使用VFW技术。DirectShow是Microsoft推出的流媒体开发包,使用它可以在支持WDM驱动的各种监控卡上采集数据,因此,使用DirectShow可以开发通用的视频监控程序。DirectShow支持ASF、MPEG、AVI、MP3、WAV等多种媒体格式,使得它很容易实现媒体数据的采集、回放。SDK是监控卡厂家提供的开发视频监控系统的一组库函数,使用SDK库函数,用户可以在不了解

3、视频压缩、回放、网络传输等技术的前提下,进行视频程序开发(SDK中通常都包含了这些技术的实现)。但是,由于不同厂家提供的监控卡SDK并不兼容,因此编写的应用程序无法移植到新的环境中。 2.2  VFW视频采集方案 VFW是Microsoft于1992年推出的数字视频软件包,它不依赖于专用的硬件设备,提供了通用的数字视频开发方案。VFW主要由AVICap.dll、MSVideo.dll、MCIAvi.drv、AVIFile.dll、vfw32.lib等库文件组成,这些库提供了相关视频、音频、AVI文件的函数,本节将介绍如何利用这些函数进行视频采集。 2.2.1  开发流程分析 VFW使用

4、的视频函数被封装在vfw32.lib库文件中,该库文件默认情况下没有被连接到MFC工程中,因此使用VFW进行视频开发的第一步是导入vfw32.lib库文件。方法如下: (1)引用vfw.h头文件。 #include "vfw.h" (2)导入vfw32.lib库文件。 #pragma comment (lib,"vfw32") 步骤2也可以在通过工程选项窗口的连接选项卡进行设置。如图2.1所示。 连接vfw32.lib库文件   图2.1  工程选项窗口 在导入vfw32.lib库文件后便可以使用视频函数了。首先调用capCreateCaptureWindow函数创建具有

5、WS_POPUP风格的视频捕捉窗口。然后调用capDriverConnect函数连接驱动程序,设置视频捕捉窗口的大小、显示位置。最后调用capPreviewRate函数设置预览速率,调用capPreview函数进行视频预览。 总结上述流程分析,VFW视频捕捉开发流程具体步骤如下: (1)引用“vfw.h”头文件并导入vfw32.lib库。 (2)创建一个线程,在线程函数中调用capCreateCaptureWindow创建视频捕捉窗口。 (3)调用capDriverConnect连接驱动程序,设置视频捕捉窗口风格、大小及父窗口。 (4)调用capPreviewRate函数设置预览速度

6、调用capPreview函数开始预览。 2.2.2  视频窗口创建 在进行视频程序开发时,第一步需要创建一个视频预览窗口。在程序中可以使用capCreateCaptureWindow函数来创建视频预览窗口,该函数语法如下: HWND VFWAPI capCreateCaptureWindow(LPCSTR lpszWindowName, DWORD dwStyle, int x,                   int y, int nWidth, int nHeight, HWND hWnd, int nID); 参数说明: lpszWindowName:表示视频捕捉窗口的

7、名称。 dwStyle:表示视频捕获窗口的风格,一般包含有WS_CHILD 和 WS_VISIBLE风格。 x、y:表示视频捕捉窗口的左上角坐标。 nWidth、nHeight:表示视频捕捉窗口的宽度和高度。 hWnd:表示视频捕捉窗口父窗口的句柄。 nID:表示视频捕捉窗口标识。 在创建视频捕捉窗口之后,需要将其显示在对话框中的适当位置。可以在对话框中预先放置一个静态文本控件,调整其大小和位置,然后将视频捕捉窗口放置在该控件的位置处就可以了。例如: m_Captured = FALSE; m_hWndVideo = capCreateCaptureWindow(NULL,WS

8、POPUP,1,1,10,10,m_hWnd,0); ::SetParent(m_hWndVideo,*this); ::SetWindowLong(m_hWndVideo,GWL_STYLE,WS_CHILD); CRect wndRC; m_Panel.GetClientRect(wndRC); m_Panel.MapWindowPoints(this,wndRC); wndRC.DeflateRect(1,1,1,1); ::SetWindowPos(m_hWndVideo,NULL,wndRC.left,wndRC.top,wndRC.Width(), wndRC.H

9、eight(),SWP_NOZORDER); ::ShowWindow(m_hWndVideo,SW_SHOW); 2.2.3  视频预览实现 在开发视频应用程序时,第一步需要实现的功能便是视频预览。在2.2.1节中笔者曾分析了视频预览的实现过程,下面以一个具体实例来说明VFW视频预览的实现过程。效果如图2.2所示。 图2.2  视频预览实现 程序设计步骤如下:   实例位置:光盘\mr\2\2.2\2.2.3\01 (1)创建一个基于对话框的工程,在对话框中添加Picture控件,如图2.3所示。 图2.3  视频预览设计窗口 (2)在类向导的“Member Var

10、iables”选项卡中为Picture控件命名,如图2.4所示。 图2.4  类向导窗口 (3)在对话框的头文件中引用“vfw.h”头文件,然后链接“vfw32.lib”库文件。 #include "vfw.h" #pragma comment (lib,"vfw32") (4)在对话框中定义一个视频预览窗口的句柄。 HWND   m_hWndVideo; //视频显示窗口 (5)在对话框初始化时创建视频预览窗口,连接视频驱动程序,设置预览帧率,开始视频预览。 BOOL CVideoPreviewDlg::OnInitDialog() {    CDialog::OnI

11、nitDialog();    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);    ASSERT(IDM_ABOUTBOX < 0xF000);    CMenu* pSysMenu = GetSystemMenu(FALSE);    if (pSysMenu != NULL)    {        CString strAboutMenu;        strAboutMenu.LoadString(IDS_ABOUTBOX);        if (!strAboutMenu.IsEmpty())        {

12、               pSysMenu->AppendMenu(MF_SEPARATOR);               pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);        }    }    SetIcon(m_hIcon, TRUE);       SetIcon(m_hIcon, FALSE);    //创建预览窗口    m_hWndVideo = capCreateCaptureWindow(NULL,WS_POPUP,1,1,10,10,m_hWnd,0);    //

13、连接驱动程序    if (capDriverConnect(m_hWndVideo,0))    {         ::SetParent(m_hWndVideo,*this);        ::SetWindowLong(m_hWndVideo,GWL_STYLE,WS_CHILD);        CRect wndRC;        m_Panel.GetClientRect(wndRC);        m_Panel.MapWindowPoints(this,wndRC);        wndRC.DeflateRect(1,1,1,1);       

14、 ::SetWindowPos(m_hWndVideo,NULL,wndRC.left, wndRC.top,wndRC.Width(),wndRC.Height(),SWP_NOZORDER);        ::ShowWindow(m_hWndVideo,SW_SHOW);        capPreviewRate(m_hWndVideo,30);        capPreview(m_hWndVideo,TRUE);    }     return TRUE; } (6)在对话框关闭时断开视频驱动程序。 void CVideoPreviewDlg::OnCan

15、cel() {    //断开驱动程序连接    capDriverDisconnect(m_hWndVideo);    CDialog::OnCancel(); } 2.2.4  捕捉参数设置 在进行视频捕捉时,通常需要设置视频捕捉参数。VFW提供了capCaptureSetSetup函数用于设置视频捕捉参数,该函数语法如下: BOOL capCaptureSetSetup(HWND hwnd, LPCAPTUREPARMS  psCapParms,UINT wSize ); 参数说明: hwnd:表示视频捕捉窗口句柄。 psCapParms:表示视频捕捉参数,该参数

16、是CAPTUREPARMS结构指针。CAPTUREPARMS结构成员描述如表2.1所示。 表2.1  CAPTUREPARMS结构成员描述 成员名称 成员类型 描述 dwRequestMicroSecPerFrame DWORD 以毫秒为单位设置捕捉帧率,默认值为66667,即每秒15帧 fMakeUserHitOKToCapture BOOL 如果为TRUE,将显示一个对话框帮助用户快速地进行捕捉设置 wPerentDropForError UINT 在捕捉过程中允许弃帧的最大百分比 fYield BOOL 如果为TRUE,将产生一个后台线程来进行视频捕捉

17、dwIndexSize DWORD 表示AVI文件最大的索引入口数 wChunkGranularity UINT 以字节为单位表示AVI文件的大小 fUsingDOSMemory BOOL 未使用 wNumVideoRequested UINT 分配视频缓冲区的最大数量 fCaptureAudio BOOL 为TRUE,表示音频被捕捉,默认值依赖于安装的音频设备 wNumAudioRequested UINT 表示分配的音频缓冲区的最大数量 vKeyAbort UINT 表示终止捕捉的虚拟键 fAbortLeftMouse BOOL 为TRUE,表

18、示单击鼠标左键停止捕捉 fAbortRightMouse BOOL 为TRUE,表示单击鼠标右键停止捕捉 fLimitEnabled BOOL 为TRUE,表示设置捕捉时间限制 wTimeLimit UINT 以秒为单位设置捕捉的超时时间 fMCIControl BOOL 为TRUE,控制MCI(媒体设备接口)兼容的视频源 fStepMCIDevice BOOL 为TRUE,使用MCI设备使用步进帧进行捕捉,为FALSE,使用MCI设备进行时时捕捉,如果fMCIControl成员为FALSE,该成员被忽略 dwMCIStartTime DWORD 以毫秒为单

19、位标识MCI设备视频捕捉序列的起始位置,如果fMCIControl成员为FALSE,该成员被忽略 dwMCIStopTime DWORD 以毫秒为单位标识MCI设备视频捕捉序列的停止位置,如果fMCIControl成员为FALSE,该成员被忽略 fStepCaptureAt2x BOOL 为TRUE,捕捉的视频帧使用两个分辨率,它可以使用软件在某个分辨率的基础上改写像素,将其该为高清晰度的图像 wStepCaptureAverageFrames UINT 在捕捉时每帧图像使用的时间大小 dwAudioBufferSize DWORD 音频缓冲区大小 fDisableW

20、riteCache BOOL 未使用 AVStreamMaster UINT 确定在写入AVI文件时,音频流是否控制时钟 wSize:表示psCapParms参数的大小。 在进行视频捕捉时,通常会根据实际需要设置捕捉参数。例如,在视频录像时,通常会将fYield成员设置为TRUE,启动后台线程来进行视频录像,这样,前台用户依然可以进行其他界面有关操作。 2.2.5  回调函数设计 在开发视频应用程序时,可以为视频捕捉窗口设计一些回调函数,这样,当视频应用程序的某些状态改变时,可以在回调函数中进行处理。VFW提供了如下的函数进行回调函数注册。 (1)capSetCallbac

21、kOnCapControl 该函数提供了视频捕捉时精确地控制捕捉开始和结束的时间。语法如下: BOOL capSetCallbackOnCapControl(HWND hwnd,  CAPCONTROLCALLBACK fpProc ); 参数说明: hwnd:表示视频捕捉窗口句柄。 fpProc:表示视频捕捉回调函数指针,其定义如下: typedef LRESULT (CALLBACK* CAPCONTROLCALLBACK)(HWND hWnd, int nState); 其中,hWnd表示视频捕捉窗口句柄,nState参数如果设置为CONTROLCALLBACK_PRERO

22、LL,表示将要开启视频源,为CONTROLCALLBACK_CAPTURING,表示应用程序允许通过返回FALSE去结束视频捕捉。 (2)capSetCallbackOnError 该函数用于为客户端应用程序设置错误处理的回调函数。语法如下: BOOL capSetCallbackOnError(HWND hwnd, CAPERRORCALLBACKA  fpProc); 参数说明: hwnd:表示视频捕捉窗口句柄。 fpProc:表示错误处理的回调函数指针,其定义如下: typedef LRESULT (CALLBACK* CAPERRORCALLBACKA)  (HWND h

23、Wnd, int nID, LPCSTR lpsz); 其中,hWnd表示视频捕捉窗口句柄,nID表示消息ID,lpsz表示消息文本描述。 (3)capSetCallbackOnFrame 该函数用于设置预览回调函数,回调函数在预览帧之前调用。语法如下: BOOL capSetCallbackOnFrame(HWND hwnd, CAPVIDEOCALLBACK  fpProc ); 参数说明: hwnd:表示视频捕捉窗口句柄。 fpProc:表示预览回调函数指针,其定义如下: typedef LRESULT (CALLBACK* CAPVIDEOCALLBACK)  (HWN

24、D hWnd, LPVIDEOHDR lpVHdr); 其中, hWnd表示视频捕捉窗口句柄,lpVHdr是一个VIDEOHDR结构指针,表示视频数据头。 (4)capSetCallbackOnStatus 该函数用于在程序中设置一个状态回调函数。语法如下: BOOL capSetCallbackOnStatus(HWND hwnd,  CAPSTATUSCALLBACKA fpProc ); 参数说明: hwnd:表示视频捕捉窗口句柄。 fpProc:表示回调函数指针,当应用程序的状态改变时将调用该函数。其定义如下: typedef LRESULT (CALLBACK* CA

25、PSTATUSCALLBACKA) (HWND hWnd, int nID, LPCSTR lpsz); 其中, hWnd表示视频捕捉窗口句柄,nID表示状态码,lpsz表示状态文本描述。 (5)capSetCallbackOnVideoStream 该函数用于注册一个回调函数,使得视频缓冲区被填充时调用回调函数。语法如下: BOOL capSetCallbackOnVideoStream(HWND hwnd, CAPVIDEOCALLBACK fpProc ); 参数说明: hwnd:表示视频捕捉窗口句柄。 fpProc:表示回调函数指针,当视频缓冲区被填充时调用回调函数,其定

26、义与capSetCallbackOnFrame函数的fpProc参数相同。 (6)capSetCallbackOnWaveStream 该函数用于注册一个回调函数,使得音频缓冲区被填充时调用回调函数。语法如下: BOOL capSetCallbackOnWaveStream (HWND hwnd, CAPWAVECALLBACK fpProc ); 参数说明: hwnd:表示视频捕捉窗口句柄。 fpProc:表示回调函数指针,当音频缓冲区被填充时调用回调函数。其定义如下: typedef LRESULT (CALLBACK* CAPWAVECALLBACK)   (HWND hW

27、nd, LPWAVEHDR lpWHdr); 其中, hWnd表示视频捕捉窗口句柄,lpWHdr是一个WAVEHDR结构指针,表示音频数据头。 (7)capSetCallbackOnYield 该函数用于注册一个回调函数,使得在每一次捕捉视频帧时调用一次回调函数。语法如下: BOOL capSetCallbackOnYield(HWND hwnd,  fpProc ); 参数说明: hwnd:表示视频捕捉窗口句柄。 fpProc:表示回调函数指针,其定义如下: typedef LRESULT (CALLBACK* CAPYIELDCALLBACK)  (HWND hWnd);

28、 其中, hWnd表示视频捕捉窗口句柄。通常,该函数由消息循环构成。 VFW的回调函数在视频预览、视频录像、视频压缩等多个地方被广泛使用。下面以统计预览帧数为例介绍VFW回调函数的使用。效果如图2.5所示。 统计预览帧数   图2.5  回调函数设计 程序设计步骤如下:   实例位置:光盘\mr\2\2.2\2.2.5\01 (1)创建一个基于对话框的工程,在对话框中添加静态文本、图像等控件,如图2.6所示。 图2.6  回调函数设计窗口 (2)利用类向导为图像、静态文本控件命令,如图2.7所示。 图2.7  MFC类向导窗口 (3)在对话框的头文件中引用

29、vfw.h”头文件,并导入“vfw32.lib”库文件。 #include "vfw.h" #pragma comment (lib,"vfw32") (4)向对话框中添加成员变量m_hWndVideo,作为预览窗口的句柄。 HWND   m_hWndVideo; //视频显示窗口 (5)定义一个全局变量,记录当前的预览帧数。 long num = 0; (6)定义一个全局函数,作为视频预览的回调函数。 LRESULT CALLBACK  PreviewCallback (HWND hWnd) {    num++;    return 0; } (7)处理对话框的

30、WM_TIMER消息,将num数值显示在界面中。 void CCallbackDesigendDlg::OnTimer(UINT nIDEvent) {    CString str;    str.Format("%i",num);    m_FrameNum.SetWindowText(str);    CDialog::OnTimer(nIDEvent); } (8)在对话框初始化时创建视频预览窗口,设置预览回调函数,开始视频预览。 BOOL CCallbackDesigendDlg::OnInitDialog() {    CDialog::OnInitDial

31、og();    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);    ASSERT(IDM_ABOUTBOX < 0xF000);    CMenu* pSysMenu = GetSystemMenu(FALSE);    if (pSysMenu != NULL)    {        CString strAboutMenu;        strAboutMenu.LoadString(IDS_ABOUTBOX);        if (!strAboutMenu.IsEmpty())        {      

32、         pSysMenu->AppendMenu(MF_SEPARATOR);               pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);        }    }    SetIcon(m_hIcon, TRUE);       SetIcon(m_hIcon, FALSE);       //创建预览窗口    m_hWndVideo = capCreateCaptureWindow(NULL,WS_POPUP,1,1,10,10,m_hWnd,0);    //连接

33、驱动程序    if (capDriverConnect(m_hWndVideo,0))    {         ::SetParent(m_hWndVideo,*this);        ::SetWindowLong(m_hWndVideo,GWL_STYLE,WS_CHILD);        CRect wndRC;        m_Panel.GetClientRect(wndRC);        m_Panel.MapWindowPoints(this,wndRC);        wndRC.DeflateRect(1,1,1,1);        :

34、SetWindowPos(m_hWndVideo,NULL,wndRC.left,        wndRC.top,wndRC.Width(),wndRC.Height(),SWP_NOZORDER);        ::ShowWindow(m_hWndVideo,SW_SHOW);        capSetCallbackOnFrame(m_hWndVideo,PreviewCallback);        capPreviewRate(m_hWndVideo,30);        capPreview(m_hWndVideo,TRUE);    }    

35、   SetTimer(1,800,NULL);    (9)在对话框关闭时断开视频驱动程序。 void CCallbackDesigendDlg::OnCancel() {    //断开驱动程序连接    capDriverDisconnect(m_hWndVideo);    CDialog::OnCancel(); } 2.2.6  视频录像设计方案 在VFW中,可以有3种方式实现视频录像。其中,最简单的方式是调用capFileSetCaptureFile函数和capCaptureSequence函数。该种方式存在许多缺点,例如,在录像时无法响应用户界面,无法实

36、现视频压缩等。第二种方式是调用capCaptureSetSetup函数,将CAPTUREPARMS结构的fYield成员设置为TRUE,启动后台线程来实现录像,然后调用capDlgVideoCompression函数让用户选择压缩器进行压缩,最后调用capFileSetCaptureFile函数和capCaptureSequence函数开始录像。第二种方式的缺点是每次录像时都需要弹出一个对话框,让用户选择一种压缩器。第三种方式是注册回调函数capSetCallbackOnVideoStream,在回调函数中压缩数据并写入AVI文件。相对于前两种方式,第三种方式更为灵活和实用,因此在进行视频录像

37、时,通常采用该种方式实现。具体实现过程如下: (1)定义一个回调函数,该回调函数实现数据压缩,并将压缩的数据写入文件流中。 (2)调用capSetCallbackOnVideoStream注册回调函数。 (3)调用ICOpen函数打开一个压缩器,并调用ICCompressBegin函数开始压缩。 (4)调用AVIFileOpen函数打开一个AVI文件,并调用AVIFileCreateStream函数创建文件流。 (5)调用capCaptureSequenceNoFile函数开始录像。 下面以一个具体实例介绍如何采用第三种方式实现视频录像。效果如图2.8所示。 图2.8  视频

38、录像设计方案   实例位置:光盘\mr\2\2.2\2.2.6\01 (1)创建一个基于对话框的工程,在对话框中添加按钮、图像控件,如图2.9所示。 图2.9  对话框资源设计 (2)在对话框的头文件中引用“vfw.h”头文件,并导入“vfw32.lib”库文件。 #include "vfw.h" #pragma comment (lib,"vfw32") (3)向对话框类中添加成员变量。 DWORD           m_Frame;              //记录帧数 COMPVARS        m_Com;                //压缩参数 B

39、ITMAPINFO     m_InInfo,m_OutInfo; //位图格式 PAVIFILE        m_pFile;              //AVI文件 AVISTREAMINFO  strhdr;               //AVI流信息 PAVISTREAM      ps;                   //AVI流指针 BOOL             m_Captured;          //是否开始捕捉 (4)定义一个回调函数,在流捕捉时执行。 LRESULT WINAPI EncodeCallback(HWND hWnd, LPVID

40、EOHDR lpVHdr) {    CVideoEncodeDlg* pDlg = (CVideoEncodeDlg*)AfxGetMainWnd();    if ((pDlg->m_Captured) && (lpVHdr->dwFlags&VHDR_DONE))    {        char* buffer = new char [lpVHdr->dwBytesUsed+1];        memset(buffer,0,lpVHdr->dwBytesUsed+1);        DWORD dwCkID         ;        DWORD dwCo

41、mpFlags    ;        DWORD dwQuality = 100;               //视频压缩        if (ICCompress(pDlg->m_Com.hic, 0, &pDlg->m_OutInfo.bmiHeader, buffer,  &pDlg->m_InInfo.bmiHeader,               (unsigned char *)lpVHdr->lpData, &dwCkID, &dwCompFlags,  pDlg->m_Frame++,0, dwQuality, NULL, NULL) == ICE

42、RR_OK)        {               AVIStreamSetFormat(pDlg->ps,pDlg->m_Frame,&pDlg->m_OutInfo, sizeof(pDlg->m_OutInfo));               AVIStreamWrite(pDlg->ps,pDlg->m_Frame ,1, (LPBYTE)  buffer, pDlg->m_OutInfo.bmiHeader.biSizeImage ,AVIIF_KEYFRAME,NULL,NULL);        }        delete []buffer;   

43、}     return 1; } (5)在对话框初始化时开始视频预览,设置视频参数。 m_Captured = FALSE; m_hWndVideo = capCreateCaptureWindow(NULL,WS_POPUP,1,1,10,10,m_hWnd,0); //连接驱动程序 if (capDriverConnect(m_hWndVideo,0)) {     ::SetParent(m_hWndVideo,*this);    ::SetWindowLong(m_hWndVideo,GWL_STYLE,WS_CHILD);    CRect wndRC;

44、    m_Panel.GetClientRect(wndRC);    m_Panel.MapWindowPoints(this,wndRC);    wndRC.DeflateRect(1,1,1,1);    ::SetWindowPos(m_hWndVideo,NULL,wndRC.left,wndRC.top,wndRC.Width(), wndRC.Height(),SWP_NOZORDER);    ::ShowWindow(m_hWndVideo,SW_SHOW);    CAPDRIVERCAPS caps;    capDriverGetCaps(m_hWnd

45、Video,sizeof(caps),&caps);    if (caps.fHasOverlay)        capOverlay(m_hWndVideo,TRUE);    CAPTUREPARMS params;    capCaptureGetSetup(m_hWndVideo,¶ms,sizeof(params));    params.fYield           = TRUE;    params.fAbortLeftMouse  = FALSE;    params.fAbortRightMouse = FALSE;    params.fLi

46、mitEnabled    = FALSE;    params.vKeyAbort        = FALSE;    params.fCaptureAudio    = FALSE;       capCaptureSetSetup(m_hWndVideo,¶ms,sizeof(params));    capSetCallbackOnVideoStream(m_hWndVideo,EncodeCallback);    capPreviewRate(m_hWndVideo,30);    capPreview(m_hWndVideo,TRUE); } (6)

47、向对话框中添加InitCompress方法,设置压缩参数信息。 void CVideoEncodeDlg::InitCompress() {    capGetVideoFormat(m_hWndVideo,&m_InInfo ,sizeof(BITMAPINFO));    capGetVideoFormat(m_hWndVideo,&m_OutInfo,sizeof(BITMAPINFO));    memset(&m_Com,0,sizeof(COMPVARS));     m_Com.cbSize=sizeof(m_Com);    //利用代码选择压缩器    m

48、Com.dwFlags=ICMF_COMPVARS_VALID;     m_Com.fccHandler=mmioFOURCC('x','v','i','d');    m_Com.fccType=ICTYPE_VIDEO;      m_Com.lFrame=0;      m_Com.lKey=15;      m_Com.lKeyCount=0;     m_Com.lDataRate = 780;    m_Com.lpbiOut=(BITMAPINFO*)&m_OutInfo;      m_Com.hic= ICOpen(ICTYPE_VIDEO,m

49、mioFOURCC('x','v','i','d'),ICMODE_COMPRESS);    m_Com.cbState = 1180;    //利用对话框选择压缩器    // ICCompressorChoose(NULL,ICMF_CHOOSE_ALLCOMPRESSORS , (LPVOID)&m_InInfo,NULL,&m_Com,"选择压缩类型");    ICCompressGetFormat(m_Com.hic,&m_InInfo.bmiHeader,&m_OutInfo.bmiHeader);    //开始压缩    int ret = ICCompre

50、ssBegin(m_Com.hic,(BITMAPINFO*)&m_InInfo, (BITMAPINFO*)&m_OutInfo);    if (ret!=ICERR_OK )        MessageBox("压缩失败"); } (7)处理“录像”按钮的单击事件,开始视频录像。 void CVideoEncodeDlg::OnOK() {    CString filename;    CFileDialog FileDlg(FALSE,"avi");    if (FileDlg.DoModal()==IDOK)    {        filename

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服