在AVICap编程时,由这三个数据结构所定义的变量,在程序中都有相对应的函数来设置和获得这些变量的每个数据成员的具体域值,而且关于这三个数据结具体的定义域,我们可以参看MSDN。此外,VIDEOHDR作为定义视频数据块头信息的数据结构,是我们采集视频流的重要信息来源,它的具体定义如下: 内容来自www.paper51.com
typedef struct videohdr_tag{ paper51.com //pointer to locked data buffer(指向被锁定的数据缓冲的指针) 内容来自论文无忧网 www.paper51.com LPBYTE lpData; 内容来自论文无忧网 www.paper51.com //Length of data buffer(数据缓冲的大小) 内容来自论文无忧网 www.paper51.com
DWORD dwBufferLength; 内容来自论文无忧网 www.paper51.com //Bytes actually used(实际使用的字节数) 内容来自论文无忧网 www.paper51.com DWORD dwBytesUsed; 内容来自论文无忧网 www.paper51.com //Milliseconds from start of srteam(视频流开始的时间,以毫秒为单位) copyright paper51.com
DWORD dwTimeCaptured; 内容来自www.paper51.com //for client’s use(用户使用的作用域) copyright paper51.com DWORD dwUser; 内容来自论文无忧网 www.paper51.com
//assorted flags (see defines) http://www.paper51.com
DWORD dwFlags; 内容来自论文无忧网 www.paper51.com
//reserved for driver(为设备保留的作用域) http://www.paper51.com DWORD dwReserved[4]; http://www.paper51.com } VIDEOHDR,NEAR * PVIDEOHDR,FAR * LPWIDEOHDR 内容来自www.paper51.com 在我们用程序来获取采集到的视频流信息时,往往需要通过访问VIDEOHER这个数据结构的lpData(指向数据缓存的指针)和dwBufferLength(数据缓存的大小)数据成员来实现。VIDEOHER数据结构在程序中没有函数显式地设置和获取,但一旦程序采集到视频流,我们就可以通过访问由VIDEOHER定义的变量的lpData(指向数据缓存的指针)和dwBufferLength(数据缓存的大小)数据成员来获得视频流中具体的图像数据信息。 copyright paper51.com 3.2.2.2函数实现 内容来自www.paper51.com 以下罗列了在采集视频流的过程中需要用到的函数,包括AVICap为我们提供的函数和自定义的回调函数(所谓回调函数,就是指由用户自己定义但是却不能由用户自己调用的函数,程序通过回调函数的设置函数,让系统适时地自动调用用户定义的这些回调函数)。 内容来自www.paper51.com (1)采集窗口的创建函数 内容来自www.paper51.com capCreateCaptureWindow http://www.paper51.com (2)三个回调函数及与之对应的回调函数的设置函数 内容来自论文无忧网 www.paper51.com ErrorCallbackProc,capSetCallbackOnError; http://www.paper51.com StatusCallbackProc,capSetCallbackOnStatus; 内容来自论文无忧网 www.paper51.com VideoCallbakcProc,capSetCallbackOnVideoStream; 内容来自论文无忧网 www.paper51.com (3)连接及断开采集窗口和采集设备的函数 内容来自论文无忧网 www.paper51.com capDriverConnect 内容来自论文无忧网 www.paper51.com capDriverDisconnect 内容来自论文无忧网 www.paper51.com (4)获取采集设备硬件性能的函数 paper51.com capDriverGetCaps http://www.paper51.com (5)获取及设置采集参数的函数 内容来自www.paper51.com
capCaptureGetSetup 内容来自论文无忧网 www.paper51.com capCaptureSetSetup http://www.paper51.com (6)开始及终止采集的函数 paper51.com capCaptureSequenceNoFile copyright paper51.com capCaptureAbort http://www.paper51.com
(7)设置视频格式的函数 copyright paper51.com capDlgVideoFormat 内容来自www.paper51.com (8)采集前的视频预览函数 内容来自www.paper51.com capPreviewRat 内容来自www.paper51.com
capPreview http://www.paper51.com 以上所列的函数除了三个回调函数的定义以外,其余函数的定义和功能说明都可以在MSDN中找到。自定义的三个回调函数: 内容来自www.paper51.com (1)出错回调函数 http://www.paper51.com LRESULTCALLBACK EXPORT ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText) copyright paper51.com
//hWnd: Applocation main window handle paper51.com //nErrID: Error code for the encountered error 内容来自www.paper51.com //lpErrorText: Error text string for theencountered error copyright paper51.com
{ paper51.com if(nErrID==0) 内容来自论文无忧网 www.paper51.com return TRUE; //Clear out old errors... http://www.paper51.com AfxMessageBox(lpErrorText,MB_OK,NULL);//在屏幕上显示消息框的函数 内容来自www.paper51.com returnTRUE; 内容来自www.paper51.com
} paper51.com
(2)状态回调函数 copyright paper51.com
LRESULT FAR PASCAL StatusCallbackProc(HWND hWnd,int nID,LPSTRlpStatusText) copyright paper51.com //hWnd: Application main window handle paper51.com
//nID: Status code for the current status copyright paper51.com
//lpStatusText: Status text string for the crurrentstatus 内容来自论文无忧网 www.paper51.com { 内容来自www.paper51.com staticint CurrentID; paper51.com 内容来自论文无忧网 www.paper51.com //theCAP_END message sometimes overwrites a useful statistics message; 内容来自www.paper51.com
if(nID==IDS_CAP_END) paper51.com
{ http://www.paper51.com
if((CurrentID==IDS_CAP_STAT_VIDEOAUDIO)|| copyright paper51.com (CurrentID==IDS_CAP_STAT_VIDEOONLY)) http://www.paper51.com return(TRUE); paper51.com } copyright paper51.com CurrentID=nID; 内容来自www.paper51.com return(LRESULT)TRUE; copyright paper51.com
} 内容来自论文无忧网 www.paper51.com (3)视频回调函数 http://www.paper51.com LRESULT FAR PASCAL VideoCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr) 内容来自www.paper51.com { paper51.com //得到视频帧的实际字节数 paper51.com
((CMainFrame*)AfxGetMainWnd())->m_dibinfo.bitmapheader. http://www.paper51.com
biSizeImage=lpVHdr->dwBytesUsed; 内容来自www.paper51.com memcpy(((CMainFrame*)AfxGetMainWnd())->m_dibinfo.buffer+ http://www.paper51.com ((CMainFrame*)AfxGetMainWnd())->m_dibinfo.VideoFormatSize, 内容来自论文无忧网 www.paper51.com lpVHdr->lpData,lpVHdr->dwBytesUsed); copyright paper51.com (((CMainFrame*)AfxGetMainWnd())->GetActiveView())-> 内容来自www.paper51.com InvalidateRect(NULL,FALSE); 内容来自论文无忧网 www.paper51.com return(LRESULT)TRUE; 内容来自www.paper51.com } copyright paper51.com 其中VideoCallbackProc回调函数最为重要。系统采集一帧图像后调用该函数。 内容来自论文无忧网 www.paper51.com
|