有用DirectShow 写关于摄像头视频捕捉的代码吗??给点提示也可。小弟对DirectShow 不懂 1000分!!!(100分

  • 主题发起人 主题发起人 muzi9298
  • 开始时间 开始时间
M

muzi9298

Unregistered / Unconfirmed
GUEST, unregistred user!
有用DirectShow 写关于摄像头视频捕捉的代码吗??给点提示也可。小弟对DirectShow 不懂 1000分!!!(100分)<br />现有一个摄像头,用VFW的方法能捕捉到视频并保存成.AVI文件。但效果不好,画面有停滞现象
据说有用DIRECTSHOW 更好。不知哪位高手不另赐教。1000分!!!!期待中!!!!!
 
安装DSPack2.1,里面有个例子叫PlayVideoCap的,可以实现你要的!
 
留下mail吧。
(Direct Show的头文件请自备,我用的8.0的)
 
lexiaoyaocyh@163.net leechange大虾,谢谢!
 
在做与多媒体有关系的东西,能否也请发一份到这:
planetike@163.com
 
#include <dshow.h>
#include <atlbase.h>
#include <stdio.h>


CComQIPtr m_pVW;
CComQIPtr m_pMC;
CComQIPtr m_pME;
CComPtr m_pGraph;
CComPtr m_pCapture;
DWORD m_dwGraphRegister;
bool bInit(HWND hWnd)

{

 HRESULT hr;

 //获得接口

hr=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,IID_IGraphBuilder,
(void **) &amp;m_pGraph);

 if (FAILED(hr))

  return false;


 hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,

 IID_ICaptureGraphBuilder2, (void **) &amp;m_pCapture);

 if (FAILED(hr))

  return false;

 m_pMC=m_pGraph;

 m_pVW=m_pGraph;

 m_pME=m_pGraph;

 //取得消息

 m_pME->SetNotifyWindow((OAHWND)(m_hWnd=hWnd), WM_GRAPHNOTIFY, 0);

 //将过滤和捕获进行连接

 m_pCapture->SetFiltergraph(m_pGraph);

 //设备联接

 //枚举设备

 CComPtr pCde=NULL;

 CComPtr pEm=NULL;


 hr=CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,

 IID_ICreateDevEnum, (void **) &amp;pCde);

 if (FAILED(hr))

  return false;

 pCde->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &amp;pEm, 0);

 if(pEm==NULL)

  return false;


 CComPtr pM=NULL;

 ULONG cFetched;

 CComPtr pBf=NULL;

 if(pEm->Next(1,&amp;pM,&amp;cFetched)==S_OK)

 {

  pM->BindToObject(0,0,IID_IBaseFilter, (void**)&amp;pBf);

  pM.Release();

 }

 else


 {

  return false;

 }

 //将设备添加到graph

 hr = m_pGraph->AddFilter(pBf, L"Video Capture");

 if (FAILED(hr))

  return false;

 //连接一个源插口

 hr=m_pCapture->RenderStream(&amp;PIN_CATEGORY_PREVIEW,&amp;MEDIATYPE_Video,pBf,
NULL, NULL);

 if (FAILED(hr))

  return false;

 pBf.Release();

 //设定视频窗口

 //设定视频窗口为主窗口的一个子窗口

 hr=m_pVW->put_Owner((OAHWND)hWnd);

 if (FAILED(hr))

  return false;

 //设定窗口样式

 m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);

 if (FAILED(hr))

  return false;

 //设定窗口大小

 CRect rectClient;

 GetClientRect(hWnd,rectClient);

 m_pVW->SetWindowPosition(0, 0, 320, 240);

 //设定可视

 hr=m_pVW->put_Visible(OATRUE);

 if (FAILED(hr))

  return false;

  //将对象加入到运行对象列表中

 CComPtr pROT;

 GetRunningObjectTable(0,&amp;pROT);

 WCHAR c[128];

 wsprintfW(c, L"FilterGraph %08x pid %08x/0", (DWORD_PTR)m_pGraph.p,
GetCurrentProcessId());

 hr = CreateItemMoniker(L"!",c,&amp;pM);

 if (FAILED(hr))

  return false;


 hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE,m_pGraph,pM,
&amp;m_dwGraphRegister);

 pM.Release();


 return false;

 }
 
接受答案了.
 
后退
顶部