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的部分,其中还提供有原代码的例子,
//可用于分析。
近期下载者:
相关文件:
收藏者: