我最近要实现捕获QQ视频图像的功能,按照网上一些资料,写了一段代码,能运行的,但就是显示不了图像觉得代码上没什么明显的问题了,但就是没视频出来,月底前还要实现网络传输视频,压力大啊~ 我是这么做的:求指点错在哪~~1.枚举视频输入设备,创建视频输入Filter *pSrc
2.创建FilterGraph、CaptureGraphBuilder2
3.pGraph->AddFilter(pSrc,L"avi");
4.添加视频预览窗口Filter *pPreview
  pGraph->AddFilter(pPreview,L"preview");
5.连接 *pSrc 和 *pPreview
6.运行pMediaControl->Run();代码如下: HRESULT hr =CoInitialize(NULL);
ICaptureGraphBuilder2 * pBuilder = NULL;
    pGraph = NULL;
    pMediaControl = NULL;
    //枚举视频设备
    ICreateDevEnum *pDevEnum = NULL;
    hr =CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,IID_ICreateDevEnum, (void **)&pDevEnum);
if (hr != NOERROR)
return;
    IEnumMoniker *pClassEnum = NULL;
    hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
if (hr != NOERROR)
return;
    ULONG cFetched;
    if(pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)     
    {
       pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);//赋值
       pMoniker->Release(); 
    }
    pClassEnum->Release();
//以上枚举设备结束,下面创建Graph
    CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(void**)&pBuilder);
    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
    pBuilder->SetFiltergraph(pGraph);
    pGraph->QueryInterface(IID_IMediaControl,(void**)&pMediaControl);
    pGraph->AddFilter(pSrc,L"avi");
    pPreview = NULL;
    CoCreateInstance(CLSID_VideoRenderer,0,CLSCTX_ALL,IID_IBaseFilter,(void**)&pPreview);
    if (pPreview != NULL)
    {
       pGraph->AddFilter(pPreview,L"preview");
       //连接引脚
       IPin * pSourceOut;
       pSourceOut = FindPin(pSrc,PINDIR_OUTPUT);
       IPin*  pPreIn = FindPin(pPreview,PINDIR_INPUT);
       pGraph->ConnectDirect(pSourceOut,pPreIn,NULL);
       //获取预览窗口
       IVideoWindow * pViewWnd= NULL;
       pPreview->QueryInterface(IID_IVideoWindow,(void**)&pViewWnd);
       if (pViewWnd)
       {
           //设置预览窗口的拥有者
   HWND hWnd = m_view.GetSafeHwnd();//(图片框)播放窗口句柄
   pViewWnd->put_Owner((long)hWnd);
         //  pViewWnd->put_Owner((long)m_hWnd);
           pViewWnd->put_Left(1);
           pViewWnd->put_Top(1);
       //获取预览窗口风格
           long style;
           pViewWnd->get_WindowStyle(&style);
           style = style & ~WS_CAPTION;
           style = style & ~WS_DLGFRAME;
           style = style & WS_CHILD;
           pViewWnd->put_WindowStyle(style);
           //设置预览窗口宽度和高度
           CRect rc;
           GetClientRect(rc);
           pViewWnd->put_Height(200);
           pViewWnd->put_Width(200);
       }
       pMediaControl->Run();
    }

解决方案 »

  1.   

    vc6的例子,调用也很方便,需要的话加我QQ 1023266328
      

  2.   

    先实现本地采集,基本弄懂下directshow编程的过程。再搞网络传输。
      

  3.   

    捕获么 在GRAPH 里再加个FILTER保存文件就可以了,这个简单的知道了。
      

  4.   

    先结贴了,本地取图像可以了,是我连接FILTER 的函数调用错误的。要用Connect。
    我再开请教网络传输视频的帖子,有兴趣的去那看看。还是要请大家多多指点下啊~