AVICap我把它封装成了一些接口(进程内组件dll),发现封装后,在组件dll里面调用
    HWND m_hVideo=capCreateCaptureWindow(NULL,WS_POPUP|WS_VISIBLE,0,0,100,100,NULL,0)
    capDriverConnect(m_hVideo,0)
    capPreviewRate(m_hVideo,15);
    capPreview(m_hVideo,TRUE);
   会阻塞进程,当然视频图像更是看不到,是否是AVICap不能被继续封装了?

解决方案 »

  1.   


       en,开一个工作线程单独进行处理是可以进行
     但发现
    capCreateCaptureWindow(NULL,WS_POPUP,0,0,100,100,NULL,0)
    我只想捕获数据,不需要预览,发现如果我不让捕获窗口具有WS_VISBLE或者不调用ShowWindow(SW_SHOW)
    让捕获窗口显示,帧回调函数根本就不会被调用,怎样让捕获窗口不显示(即隐藏起来,只开启摄像头),然后我想要帧回调函数被调用,即获取采集数据,怎么办?
      

  2.   

    比较笨的方法:
    1、
    显示到屏幕范围外围 比如(-1000,-1000,100,100)
    2、
    隐藏任务栏对应窗口:
    SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
      

  3.   

     那个方法还是不行噢,预览窗口只要一离开桌面视区,不管其当前状态是否可见,都会停止采集回调.#pragma  pack(1)
    struct FrameInfo
    {
    ULONG uSizeHead;      //头部长
    ULONG uSizeFrameData; //帧数据长         char   errCode;       //暂时不用
    };
    #pragma pack()LRESULT capFrame(HWND hWnd,LPVIDEOHDR lpVHR)
    {
      ................   BITMAPINFO bi[1024*6]={0};
       int size=capGetVideoFormat(hWnd,bi,len); //获取视频格式
        //网络数据处理
        FrameInfo fi;
        fi.uSizeHead=size;
        fi.uSizeFrameData=lpVHR->dwBufferLength
        ret=send((*it)->LR.RemoteView.sockCom,(char*)&fi,sizeof(fi),0); //发送控制头
        if(ret>0)
        {
              ret=send((*it)->LR.RemoteView.sockCom,(char*)&bi,size,0); //发送格式头
      ret=send((*it)->LR.RemoteView.sockCom,(char*)lpVHR->lpData,lpVHR->dwBytesUsed);//发送帧数据
        }
       if(ret<=0)
       {
     closesocket((*it)->LR.RemoteView.sockCom);  //关闭
     delete (*it);
     pCapInstance->m_lstView.erase(it);
     it=pCapInstance->m_lstView.begin();
     end=pCapInstance->m_lstView.end();
     continue;
       }
       ............
    }远程帧信息处理部分代码:    FrameInfo fi={0};
        int ret=recv(pViewInfo->sockCom,(char*)&fi,sizeof(fi),0); //实时数据不做额外超时    
         if(ret<=0) break;   //退出
         if(ret!=sizeof(fi)) continue;

         int left=fi.uSizeHead+fi.uSizeFrameData;
         char* pos=buffer;
         while(left>0)
         {
     ret=recv(pViewInfo->sockCom,pos,left,0);
     if(ret<=0) break;
     pos+=ret;
     left-=ret;
         }
         lbi=(LPBITMAPINFOHEADER)buffer;
         pFrameData=(LPVOID)(buffer+fi.uSizeHead);

         if(!IsWindow(hShowWnd))
         {
     OutputConsole(" Warning: 非窗口....\r\n");
      continue;
         }
         GetClientRect(hShowWnd,&rc);
         HDC hDC=GetDC(hShowWnd);
         HDRAWDIB hdd=DrawDibOpen();
         if(hdd==NULL)
         {
    OutputConsole(" warning: hdd=NULL err=%d \r\n",GetLastError());
    continue;
         }
         //::EnterCriticalSection(&pViewInfo->cs);
         OutputConsole("\r\n 绘制...... width=%d height=%d\r\n",lbi->biWidth,lbi->biHeight);     [color=#FF0000]///下面这个绘制出来的是蓝屏!!!!!!!![color]
         DrawDibDraw(hdd,hDC,0,0,
    rc.right-rc.left,rc.bottom-rc.top,
    lbi,pFrameData,0,0,
    lbi->biWidth,lbi->biHeight,
    DDF_HALFTONE);

         //::LeaveCriticalSection(&pViewInfo->cs);

    DrawDibClose(hdd);
    ReleaseDC(hShowWnd,hDC);
    不好意思,继续求解决(对AVICap不是很熟),远程帧信息传送后,为什么绘制出来的效果是蓝屏的,但直接在本地绘制却是好的(传输到远程后,绘制却是蓝屏)?