⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme1.txt

📁 视频捕捉API的中文说明文档
💻 TXT
字号:

	#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的部分,其中还提供有原代码的例子,
	//可用于分析。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -