Camera Capture

///////////////PreviewCamera(视频预览steps)///////////////////////////
step1:   先释放DSHOW接口

step2:  创建ICaptureGrapBuilder2接口,
【code】
      CComPtr<ICaptureGrapBuilder2>   m_pCaptureGraphBuilder;
      CHK(m_pCaptureGraphBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder));

step3: 创建IGrapBuilder接口
       CComPtr<IGraphBuilder> m_pGraphBuilder;
       CHK(m_pGraphBuilder.CoCreateInstance(CLSID_FilterGraph));

step4: 关联Capture Grap Builder 和 Filter Graph Manager
        CHK( m_pCaptureGraphBuilder->SetFiltergraph(m_pGraphBuilder));

~~~

step5:  得到IMediaSeeking接口和IMediaEvent接口
        CComPtr<IMediaSeeking> m_pMediaSeeking;
        CHK(m_pGraphBuilder.QueryInterface(&m_pMediaSeeking));
    
         CComPtr<IMediaEvent> m_pMediaEvent;
         CHK(m_pGraphBuilder.QueryInterface(&m_pMediaEvent));

step6:  (new) 创建视频捕捉Filter  ;创建视频捕捉属性页接口
          CComPtr<IBaseFilter> m_pVideoCaptureFilter;  //定义基本过滤器
          CHK(m_pVideoCaptureFilter.CoCreateInstance(CLSID_VideoCapture));

 CComPtr<IPersistPropertyBag>    m_pPropertyBag ;
 CHK(m_pVideoCaptureFilter->QueryInterface(&m_pPropertyBag));


step7:  选择视频捕获设备,默认选择第一个视频捕获设备
    [Sub Function]
   //[out] wzDeviceName
 GetFirstCameraDriver(wzDeviceName);
                   
                CComVariant   varCamName;  //定义摄像头设备名称
 varCamName = wzDeviceName;
 
 //实例化继承与IPropertyBag类的对象,调用Write成员函数写入属性值
 ...
 调用load函数加载自定义PropertyBag
 CHK(m_pPropertyBag->Load(&PropBag,NULL));

step8:   将视频捕捉FILTER添加到FILTER图中。
 CHK(m_pGraphBuilder->AddFilter(m_pVideoCaptureFilter,L"Video capture source"));

step9:   创建IDMOWrapper接口,(貌似用来编码Encode)
 CComPtr<IDMEWrapper> pWrapperFilter
 CComPtr<IBasicFilter> pVideoEncode;
 CHK(pVideoEncode.CoCreateInstance(CLSID_DMOWrapperFilter));
 CHK( pVideoEncode.QueryInterface(&pWrapperFilter) );

step10:   加载WMV9 DMO
 CHK(pWrapperFilter->Init

(CLSID_CWMV9EncMediaObject,DMOCATEGORY_VIDEO_ENCODE));

step11:   将编码器加到Filter图中
 CHK(m_pGraphBuilder->AddFilter(pVideoEncode,L"WMV9 DMO Encode"));

step12:    创建ASF多路(复用)器,并加入到过滤器图中
 CHK( m_pCaptureGraphBuilder->SetOutputFileName

(&MEDIASUBTYPE_Asf,strFileName,&pASFMultiplexer,&pFileSinkFilter) );

step13:     渲染预览视频PIN
 CHK(m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_PREVIEW,
  &MEDIATYPE_Video, m_pVideoCaptureFilter,
  NULL, NULL ));
 
step14:  设置视频预览窗口
 //视频窗口接口
 CComPtr<IVideoWindow> m_pVideoWindow ;
 CHK(m_pGraphBuilder.QueryInterface(&m_pVideoWindow));

 ////设置视频播放的WINDOWS窗口
 m_pVideoWindow->put_Owner((OAHWND)hVideoWnd);
 m_pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS |

WS_CLIPCHILDREN);

 //设置视频尺寸
 GetClientRect(hVideoWnd,&rectVideo);
 m_pVideoWindow->SetWindowPosition(0,0,rectVideo.Width(),rectVideo.Height());
 m_pVideoWindow->put_Visible(OATRUE);

step15:   ,渲染捕捉PIN,用于录像
 CHK(m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_CAPTURE,

&MEDIATYPE_Video, m_pVideoCaptureFilter, pVideoEncoder, pASFMultiplexer ));

Step16:   创建Still Pin,用于抓图
 CHK(m_pImageSinkFilter.CoCreateInstance(CLSID_IMGSinkFilter));
 CHK(m_pGraphBuilder->AddFilter(m_pImageSinkFilter, L"Still image filter" ));
 CHK(m_pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_STILL,

&MEDIATYPE_Video, m_pVideoCaptureFilter, NULL, m_pImageSinkFilter ));

Step17:   设置捕捉流暂停
 CHK(m_pCaptureGraphBuilder->ControlStream( &PIN_CATEGORY_CAPTURE,

&MEDIATYPE_Video, m_pVideoCaptureFilter, 0, 0 ,0,0 ));

Step18:   预览视频
 CHK(m_pMediaControl->Run());
 Sleep(1000);

posted @ 2010-10-15 18:36  hungryMan  阅读(958)  评论(0编辑  收藏  举报