用VC++ 5.0实现视频捕获编程
2008-11-13 19:31:19 来源:WEB开发网 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、局域网上的会议系统等。
更多精彩
赞助商链接