一壶漂泊

那些年的那些烂人和那些破事
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用DirectX SDK和VC++做视频采集的代码片段

Posted on 2008-06-17 19:37  GaeaSoft  阅读(1231)  评论(0)    收藏  举报

//枚举硬件设备
 ICreateDevEnum *pCreateDevEnum=0;
 hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);

//得到ICreateDevEnum 接口以后,枚举视频输入设备
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
……
pEm->Reset();
ULONG cFetched;
IMoniker *pM;
while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
{
       IPropertyBag *pBag=0;
       hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
       ……
       VARIANT var;
       var.vt = VT_BSTR;
       hr = pBag->Read(L"FriendlyName", &var, NULL);
       ……
       WCHAR* wzName = NULL;
       hr = pM->GetDisplayName(NULL, NULL, &wzName);
}

//判断视频输入设备是DV,还是其他类型
//如果该Filter上支持IAMExtTransport接口,则认为它是数码摄像机

 IAMExtTransport* lpAMExtTransport = NULL;
 hr = lpBaseFilter->QueryInterface(IID_IAMExtTransport, (void**)&lpAMExtTransport);

// 如果该Filter上支持IAMAnalogVideoDecoder接口,则认为它是WDM视频采集设备
 IAMAnalogVideoDecoder* lpAMAnalogVideoDecoder = NULL;
 hr = lpBaseFilter->QueryInterface(IID_IAMAnalogVideoDecoder, (void**)&lpAMAnalogVideoDecoder);

// 如果该Filter上支持IAMVfwCaptureDialogs接口,则认为它是VFW视频采集设备
 IAMVfwCaptureDialogs* lpAMVfwCaptureDialogs = NULL;
 hr = lpBaseFilter->QueryInterface(IID_IAMVfwCaptureDialogs, (void**)&lpAMVfwCaptureDialogs);