VC++实现视频捕获编程
2010-07-20 20:45:00 来源:WEB开发网7、分别处理Setting下的三个菜单项,它们可分别控制视频源、视频格式及显示:
if(gCapDriverCaps.fHasDlgVideoSource)
capDlgVideoSource(ghWndCap);//Videosource对话框
if(gapDriverCaps.fHasDlgVideoFormat)
capDlgVideoFormat(ghWndCap);//Videoformat对话框
if(CapDriverCaps.fHasDlgVideoDisplay)
capDlgVideoDisplay(ghWndCap);//Videodisplay对话框
8、处理VideoStream菜单项,它捕获视频流到一个.AVI文件:
charszCaptureFile[]="MYCAP.AVI";
capFileSetCaptureFile(ghWndCap,szCaptureFile);//指定捕获文件名
capFileAlloc(ghWndCap,(1024L*1024L*5));//为捕获文件分配存储空间
capCaptureSequence(ghWndCap);//开始捕获视频序列
9、处理SingleFrame菜单项:
capGrabFrame(ghWndCap);//捕获单帧图像
10、定义三个回调函数:
LRESULTCALLBACKStatusCallbackProc(HWNDhWnd,intnID,LPSTRlpStatusText)
{
if(!ghWndCap)returnFALSE;
//获得捕获窗的状态
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;
}
LRESULTCALLBACKErrorCallbackProc(HWNDhWnd,intnErrID,LPSTRlpErrorText)
{
if(!ghWndCap)
returnFALSE;
if(nErrID==0)
returnTRUE;//清除旧的错误
wsprintf(gachBuffer,"Error#%d",nErrID);//显示错误标识和文本
MessageBox(hWnd,lpErrorText,gachBuffer,MB_OK|MB_ICONEXCLAMATION);
return(LRESULT)TRUE;
}
LRESULTCALLBACKFrameCallbackProc(HWNDhWnd,LPVIDEOHDRlpVHdr)
{
if(!ghWndCap)
returnFALSE;
//假设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过滤掉一些消息,例如鼠标消息。
四、结束语
VisualC++提供的AVICap窗口类为捕获数字视频流及其相关操作提供了很大的方便,灵活编写其中的回调函数可满足实时视频传输的需要,例如应用程序可直接从缓冲中取得数字视频并对其进行压缩编码后实时地传到远端的计算机。笔者所从事的电话网上的可视电话系统就是采用AVICap进行视频捕获的,这种方法同样可用于其它多媒体会议系统中,如ISDN、局域网上的会议系统等。
更多精彩
赞助商链接