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);