由于篇幅有限,下面仅介绍与视频捕获相关的编程。
1、定义全局变量:
HWND ghWndCap ; //捕获窗的句柄
CAPDRIVERCAPS gCapDriverCaps ; //视频驱动器的能力
CAPSTATUS gCapStatus ; //捕获窗的状态
2、处理WM_CREATE消息:
//创建捕获窗,其中hWnd为主窗口句柄
ghWndCap = capCreateCaptureWindow((LPSTR) "Capture Window ",WS_CHILD | WS_VISIBLE, 0, 0, 300,240, (HWND) hWnd, (int) 0);
//登记三个回调函数,它们应被提前申明
capSetCallbackOnError(ghWndCap, (FARPROC)ErrorCallbackProc); capSetCallbackOnStatus(ghWndCap, (FARPROC)StatusCallbackProc); capSetCallbackOnFrame(ghWndCap, (FARPROC)FrameCallbackProc);
capDriverConnect(ghWndCap,0); // 将捕获窗同驱动器连接
//获得驱动器的能力,相关的信息放在结构变量gCapDriverCaps中
capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS)) ;
3、处理WM_CLOSE消息:
//取消所登记的三个回调函数
capSetCallbackOnStatus(ghWndCap, NULL);
capSetCallbackOnError(ghWndCap, NULL);
capSetCallbackOnFrame(ghWndCap, NULL);
capCaptureAbort(ghWndCap);//停止捕获
capDriverDisconnect(ghWndCap); //将捕获窗同驱动器断开
4、处理菜单项Preview:
capPreviewRate(ghWndCap, 66); // 设置Preview模式的显示速率
capPreview(ghWndCap, TRUE); //启动Preview模式
5、处理菜单项Overlay:
if(gCapDriverCaps.fHasOverlay) //检查驱动器是否有叠加能力
capOverlay(ghWndCap,TRUE); //启动Overlay模式
6、处理菜单项Exit:
SendMessage(hWnd,WM_CLOSE,wParam,lParam);
7、分别处理Setting下的三个菜单项,它们可分别控制视频源、视频格式及显示:
if (gCapDriverCaps.fHasDlgVideoSource)
capDlgVideoSource(ghWndCap); //Video source 对话框
if (gapDriverCaps.fHasDlgVideoFormat)
capDlgVideoFormat(ghWndCap); // Video format 对话框
if (CapDriverCaps.fHasDlgVideoDisplay)
capDlgVideoDisplay(ghWndCap); // Video display 对话框
8、处理Video Stream菜单项,它捕获视频流到一个.AVI文件:
char szCaptureFile[] = "MYCAP.AVI ";
capFileSetCaptureFile( ghWndCap, szCaptureFile); //指定捕获文件名
capFileAlloc( ghWndCap, (1024L * 1024L * 5)); //为捕获文件分配存储空间
capCaptureSequence(ghWndCap); //开始捕获视频序列
9、处理Single Frame菜单项:
capGrabFrame(ghWndCap); //捕获单帧图像
10、定义三个回调函数:
LRESULT CALLBACK StatusCallbackProc(HWND hWnd, int nID, LPSTR lpStatusText)
{
if (!ghWndCap) return FALSE;
//获得捕获窗的状态
capGetStatus(ghWndCap, &gCapStatus, sizeof (CAPSTATUS));
//更新捕获窗的大小
SetWindowPos(ghWndCap, NULL, 0, 0, gCapStatus.uiImageWidth,
gCapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
if (nID == 0) { // 清除旧的状态信息
SetWindowText(ghWndCap, (LPSTR) gachAppName);
return (LRESULT) TRUE;
}
// 显示状态 ID 和状态文本
wsprintf(gachBuffer, "Status# %d: %s ", nID, lpStatusText);
SetWindowText(ghWndCap, (LPSTR)gachBuffer);
return (LRESULT) TRUE;
}
LRESULT CALLBACK ErrorCallbackProc(HWND hWnd, int nErrID,LPSTR lpErrorText)
{
if (!ghWndCap)
return FALSE;
if (nErrID == 0)
return TRUE;// 清除旧的错误
wsprintf(gachBuffer, "Error# %d ", nErrID); //显示错误标识和文本
MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION);
return (LRESULT) TRUE;
}
LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
{
if (!ghWndCap)
return FALSE;
//假设fp为一打开的.dat文件指针
fwrite(fp,lpVHdr-> lpData,lpVHdr-> dwBufferLength,1);
return (LRESULT) TRUE ;
}
值得注意的是:应在.cpp文件中加入#include 一句,在Link设置中加入vfw32.lib。
上述的回调函数FrameCallbackProc是将视频数据直接从缓冲写入文件,也可利
用memcpy函数将视频数据直接拷贝到另一缓存。同理,可定义VideoStreamCallbackProc。
capSetCallbackOnVideoStream的使用比capSetCallbackOnFrame稍微复杂一些。在捕获过
程中,当一个新的视频缓冲可得时,系统就调用它所登记的回调函数。在缺省情况下,捕
获窗在捕获过程中不允许其它应用程序继续运行。为了取消这个限制,可以设置CAPTUREPARMS
的成员fYield为TRUE或建立一个Yield回调函数。为了解决潜在的重入(reentry)问题,可
在YieldCallbackProc中用PeekMessage过滤掉一些消息,例如鼠标消息。
你用google搜一下视频捕获 vfw 可以搜到很多
http://www.ccw.com.cn/htm/app/aprog/01_2_5_5.asp
http://www.xhstudio.net/show.asp?id=1433
1、定义全局变量:
HWND ghWndCap ; //捕获窗的句柄
CAPDRIVERCAPS gCapDriverCaps ; //视频驱动器的能力
CAPSTATUS gCapStatus ; //捕获窗的状态
2、处理WM_CREATE消息:
//创建捕获窗,其中hWnd为主窗口句柄
ghWndCap = capCreateCaptureWindow((LPSTR) "Capture Window ",WS_CHILD | WS_VISIBLE, 0, 0, 300,240, (HWND) hWnd, (int) 0);
//登记三个回调函数,它们应被提前申明
capSetCallbackOnError(ghWndCap, (FARPROC)ErrorCallbackProc); capSetCallbackOnStatus(ghWndCap, (FARPROC)StatusCallbackProc); capSetCallbackOnFrame(ghWndCap, (FARPROC)FrameCallbackProc);
capDriverConnect(ghWndCap,0); // 将捕获窗同驱动器连接
//获得驱动器的能力,相关的信息放在结构变量gCapDriverCaps中
capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS)) ;
3、处理WM_CLOSE消息:
//取消所登记的三个回调函数
capSetCallbackOnStatus(ghWndCap, NULL);
capSetCallbackOnError(ghWndCap, NULL);
capSetCallbackOnFrame(ghWndCap, NULL);
capCaptureAbort(ghWndCap);//停止捕获
capDriverDisconnect(ghWndCap); //将捕获窗同驱动器断开
4、处理菜单项Preview:
capPreviewRate(ghWndCap, 66); // 设置Preview模式的显示速率
capPreview(ghWndCap, TRUE); //启动Preview模式
5、处理菜单项Overlay:
if(gCapDriverCaps.fHasOverlay) //检查驱动器是否有叠加能力
capOverlay(ghWndCap,TRUE); //启动Overlay模式
6、处理菜单项Exit:
SendMessage(hWnd,WM_CLOSE,wParam,lParam);
7、分别处理Setting下的三个菜单项,它们可分别控制视频源、视频格式及显示:
if (gCapDriverCaps.fHasDlgVideoSource)
capDlgVideoSource(ghWndCap); //Video source 对话框
if (gapDriverCaps.fHasDlgVideoFormat)
capDlgVideoFormat(ghWndCap); // Video format 对话框
if (CapDriverCaps.fHasDlgVideoDisplay)
capDlgVideoDisplay(ghWndCap); // Video display 对话框
8、处理Video Stream菜单项,它捕获视频流到一个.AVI文件:
char szCaptureFile[] = "MYCAP.AVI ";
capFileSetCaptureFile( ghWndCap, szCaptureFile); //指定捕获文件名
capFileAlloc( ghWndCap, (1024L * 1024L * 5)); //为捕获文件分配存储空间
capCaptureSequence(ghWndCap); //开始捕获视频序列
9、处理Single Frame菜单项:
capGrabFrame(ghWndCap); //捕获单帧图像
10、定义三个回调函数:
LRESULT CALLBACK StatusCallbackProc(HWND hWnd, int nID, LPSTR lpStatusText)
{
if (!ghWndCap) return FALSE;
//获得捕获窗的状态
capGetStatus(ghWndCap, &gCapStatus, sizeof (CAPSTATUS));
//更新捕获窗的大小
SetWindowPos(ghWndCap, NULL, 0, 0, gCapStatus.uiImageWidth,
gCapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
if (nID == 0) { // 清除旧的状态信息
SetWindowText(ghWndCap, (LPSTR) gachAppName);
return (LRESULT) TRUE;
}
// 显示状态 ID 和状态文本
wsprintf(gachBuffer, "Status# %d: %s ", nID, lpStatusText);
SetWindowText(ghWndCap, (LPSTR)gachBuffer);
return (LRESULT) TRUE;
}
LRESULT CALLBACK ErrorCallbackProc(HWND hWnd, int nErrID,LPSTR lpErrorText)
{
if (!ghWndCap)
return FALSE;
if (nErrID == 0)
return TRUE;// 清除旧的错误
wsprintf(gachBuffer, "Error# %d ", nErrID); //显示错误标识和文本
MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION);
return (LRESULT) TRUE;
}
LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
{
if (!ghWndCap)
return FALSE;
//假设fp为一打开的.dat文件指针
fwrite(fp,lpVHdr-> lpData,lpVHdr-> dwBufferLength,1);
return (LRESULT) TRUE ;
}
值得注意的是:应在.cpp文件中加入#include 一句,在Link设置中加入vfw32.lib。
上述的回调函数FrameCallbackProc是将视频数据直接从缓冲写入文件,也可利
用memcpy函数将视频数据直接拷贝到另一缓存。同理,可定义VideoStreamCallbackProc。
capSetCallbackOnVideoStream的使用比capSetCallbackOnFrame稍微复杂一些。在捕获过
程中,当一个新的视频缓冲可得时,系统就调用它所登记的回调函数。在缺省情况下,捕
获窗在捕获过程中不允许其它应用程序继续运行。为了取消这个限制,可以设置CAPTUREPARMS
的成员fYield为TRUE或建立一个Yield回调函数。为了解决潜在的重入(reentry)问题,可
在YieldCallbackProc中用PeekMessage过滤掉一些消息,例如鼠标消息。
你用google搜一下视频捕获 vfw 可以搜到很多
http://www.ccw.com.cn/htm/app/aprog/01_2_5_5.asp
http://www.xhstudio.net/show.asp?id=1433