视频捕捉中要捕捉视频流是不是必须使用回调函数?我用的vfw,如果要使用回调函数,是不是自己要全部重写,就像子函数一样?谢谢!

解决方案 »

  1.   

    用vfw的话看你要把捕捉到得视频数据如何处理,如果要直接保存为avi,那就不必自己写回调函数,因为vfw就是为捕捉avi文件设计的,它可以直接完成捕捉-压缩-保存avi的操作。
    如果你要进行其他操作,那么就必须自己完成回调函数。不过这个很简单,每一帧捕捉到的图像都被作为参数传递到回调函数中,自己建一个位图然后操作就行了。捕捉视频还可以使用dshow来做,但dshow内建的功能只能完成捕捉-回放,如果你要保存为其他文件,就必须自己开发一个dshow renderer filter来写数据。这个比vfw难度要高一些。
      

  2.   

    //一个回调函数的例子, 保存每一帧图象为bmp文件LRESULT CALLBACK CCapVideo::capVideoStreamCallback(HWND hWnd, LPVIDEOHDR lpVHdr)
    {
    CCapVideo *pObj = (CCapVideo*)capGetUserData(hWnd);
    return pObj->OnStream(lpVHdr);
    }LRESULT CCapVideo::OnStream(LPVIDEOHDR lpVHdr)
    {
    static int i = 0; char szFileName[_MAX_PATH];
    sprintf(szFileName, "d:\\savebmp\\%03d.bmp", i++);
    CBMPWriter::SaveDIB(szFileName, lpVHdr->lpData, lpVHdr->dwBytesUsed,
                     m_pbmpInfo); return 0;
    }