CapTxt

所属分类:文章/文档
开发工具:Visual C++
文件大小:3KB
下载次数:41
上传日期:2004-09-10 11:42:39
上 传 者JANAN
说明:  视频捕捉API的中文说明文档
(video capture API documentation, the Chinese)

#include"vfw.h" HWND ghCapWnd; //视频采集窗口句柄 CAPDRIVECAPS gCapDrvCaps; //结构,定义捕获驱动器性能 Cstring gCapFilename; //视频捕获的文件名 LRESULT CALLBACK FrameCallbackProc(HWNDghWnd, LPVIDEOHDR lpVData) { unsigned char *data; data=lpVData->lpData/*获得视频数据首址并将数据存入data数组中以便处理*/ …… }/*定义回调函数( 第二部分详细说明)*/ //然后在OnInitDialog( )函数中加入如下代码: CWnd pWnd=AfxGetMainWnd()->GetDlgItem(IDC_Pict); /*Picture控件作为父窗口,并获得其窗口句柄*/ Crect rect;//设矩形变量,为获得采集窗口大小之用 PWnd->GetWindowRect(&rect); //得到窗口的大小 ghCapWnd=capCreateCaptureWindow((LPTSTR)TEXT("视频窗"), WS_CHILD|WS_VISIBLE|WS_EX_CLIENTEDE |WS_EX_DLGMODALFRAME, 0,0,rect.Width( ),rect.Height( ), pWnd->GetSafeHwnd( ),0); /*建立采集窗口,它通常是附着在某父窗口之上,这里是利用Picture控件窗口,并获得采集窗口句柄,这项工作相当重要,之后之后的函数都要用到它*/ ASSER(ghCapWnd); if (capDriverConnect(ghCapWnd, 0))/*判断采集窗口是否与0号捕获卡驱动程序相连接,这里采用简化的方法,因只一块捕获卡,计算机自动登记号码通常是为0*/ { capDriverGetCaps(ghCapWnd, &gCapDrvCaps, sizeof(CAPDRIVERCAPS)); /*作默认值初始化,并得到驱动器的性能,存入CAPDRIVERCAPS结构中*/ if (gCapDrvCaps.fCaptureInitialized); //如初始化成功 { capPreviewRate(ghCapWnd, 33); //设置预视帧频 capPreview(ghCapWnd, TRUE); /*设置成预视模式(preview),该方式是通过内存作为缓冲区来存放视频数据,它是获得视频数据的必要条件。另一种称为Overlay模式,它是不经过内存而直接将数据传入显存中。它不符合我们要求。*/ capSetCallbackOnFrame(ghCapWnd, FrameCallbackProc); //设置每帧结束后所调用的回调函数(第二部作解释) } else{//初始化不成功 AfxMessageBox("捕获卡初始化失败"); //初始化不成功的消息框显示 AfxGetMainWnd( )->postMessage(WM_CLOSE); //发送WM_CLOSE消息,关闭对话框   } } else{//连接不成功 AfxMessageBox("捕获卡连接失败"); //连接不成功的消息框显示 AfxGetMainWnd( )->postMessage(WM_CLOSE); //发送WM_CLOSE消息,关闭对话框   } //接下来编写各按钮单击事件的响应函数内客。 void XXX:: OnButton1( ) { capDlgVideoFormat( ghCapWnd); /*产生一视频格式对话框,这是捕获卡驱动程序中提供的,用户可通过它来选择视频格式*/ } void XXX:: OnButton2( ) { capDlgVideoSource( ghCapWnd); //产生一视频源选择对话框产生一视频源选择对话框,它也是驱动程序中带有的 } void XXX::OnButton3( ) { capGrabFrameNoStop(ghCapWnd); //该函数从捕获卡获得的帧数据不被压缩地存入视频缓冲区中,之后将其显示出来,而采用capGrabCapFrame( )会产生图象冻结效果。 capEditCopy(m_hCapWnd); //将单帧图象复制到粘帖板上 } void XXX::OnButton4( ) { // 写视频数据存盘程序 capCaptureSequence(ghCapWnd); //开始保存AVI文件到默认的文件中"C:\Capture.avi"。 } Void XXX::OnButton5( ) { capCaptureSequenceNoFile(ghCapWnd); //不存盘操作,但视频仍然显示 } void XXX::OnCancel( ) { capDriverDisconnect(m_hCapWnd); //断开视频窗口与捕获驱动程序的连接 CDialog::OnCancel(); //退出函数 } //以上完成了视频图象的捕获编程工作,下面将就视频数据的获得加以阐述。 //第二部分:获得数据包括二个概念,一是将数据存盘, //另一是得到数据缓冲区的首址和长度,以便对数据进行实时处理。 //数据存盘是在OnButton4( )的函数中实现,它采用了capCaptureSequence()宏函数, //用了默认的文件名,若要存入指定的文件名中, //就要再加入capFileSetCaptureFile( )宏函数,格式如下: Cstring ghCapFilename; //文件名字符串变量 ghCapFilename="C:\\MyFile.avi"; //采用自定义的文件名赋给其变量。 capFileSetCaptureFile(ghCapWnd, gCapFileName.GetBuffer(225)); //设置文件名于视频文件。 //停止存盘可采用capCaptureSequenceNoFile( )宏函数, //这在XXX::OnButton5( ) 函数中用到。 //获得实时数据缓冲区的首址和长度并对图象数据进行处理, //就要运用到视频处理的回调机制 //(callback mechanism)。在VFW中有几条这样的宏函数, //用于设置在发生某事件后能做出反应的回调函数的宏函数, //它和中断服务机制很相似,一经条件满足,程序会自动进入相应的回调函数体中, //该函数究竟要做些什么,全由开发者借助其参数自行编制程序来完成。 //提到参数不能不对VIDEOHDR结构做些解释,它定义了视频数据块头信息, //其中的lpData成员为指向数据缓冲区的首址,dwBufferLength成员为数据区的大小, //在编写回调函数时常常要使用到它们。以下仅对二种回调函数进行解释: 1.capSetCallbackOnFrame(hWnd, fpProc ), //上面程序所用到的就属这种设置回调函数的宏函数,它只要一启动视频捕获, //当一帧结束就立刻产生回调动作,而究竟是那一个回调函数响应, //就由登记在设置宏函数中的fpProc参数来决定, //这里是定义了FrameCallbackProc(HWND ghWnd, LPVIDEOHDR lpVData)回调函数, //它是一帧一帧地在同一个缓冲区进行刷新,即每帧数据的首址不变。 //自然开发者可借助这一特点用于编写图象处理程序,但不能过长, //否则视频显示不流畅。另外回调函数要提前定义,即在程序的头部进行定义, //格式同上。 //2.CapSetCallbackOnVideoStream(hWnd, fpProc), //它要和capCaptureSequenceNoFile(hWnd)或capCaptureSequence(hWnd)配合使用, //只有当其中的一个被执行后,回调动作才会产生,它同样是一帧结束便产生回调, //但与上面不同的是:每次数据都是追加在上一帧数据的后面,即lpData在不断地改变, //直到所分配的数据缓冲区用完为止(即缓冲区无效)。 //同样,开发者可按照这一特点来编程。 //视频捕获在IT业中同样有着广泛的用途,这里仅做粗浅和有限的介绍, //若想进一步认识,阅读MSDN有关VFW的部分,其中还提供有原代码的例子, //可用于分析。

近期下载者

相关文件


收藏者