directshow 之 添加视频预览

HRESULT CVideoSource::AddVedioPreviewFilter(char* varDeviceName)
{
 HRESULT hr = NULL;
 IMoniker *pMoniker = NULL;
 IPropertyBag *pPropBag = NULL;
 
 BOOL bFind = false;
 VARIANT varDescriptName;
 VARIANT varFriendName;
 VariantInit(&varDescriptName);
 VariantInit(&varFriendName);


 // Create the System Device Enumerator.
 hr = CoCreateInstance( CLSID_SystemDeviceEnum,
  NULL,
  CLSCTX_INPROC_SERVER,
  IID_ICreateDevEnum,
  reinterpret_cast<void**>(&m_pDevEnum)
  );
 if (FAILED(hr))
 {
  return hr;
 }
 // Create an enumerator for the video capture category.
 hr = m_pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&m_pEnumMoniker, 0);
 //if (!SUCCEEDED(hr)||pEnum)
 if (hr == S_FALSE)
 {
  //there is not video device
  return hr;
 }
 while (m_pEnumMoniker->Next(1, &pMoniker, NULL) == S_OK)
 {
  hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag));
  if (FAILED(hr))
  {
   pMoniker->Release();
   continue;  // Skip this one, maybe the next one will work.
  }
  // Find the description or friendly name.

  hr = pPropBag->Read(L"Description", &varDescriptName, 0);
  if (FAILED(hr))
  {
  }
  hr = pPropBag->Read(L"FriendlyName", &varFriendName, 0);
  
  CString str(varFriendName.bstrVal);  
  int iret = strcmp(varDeviceName,str);
  if (iret==0)
  {
   bFind = true;
   break;
  }
  VariantClear(&varDescriptName);
  VariantClear(&varFriendName);
  pPropBag->Release();
  pMoniker->Release();
 }

 if (!bFind)
 {
  ErrMsg(TEXT("没有定位到视频采集设备"));
  return NULL;
 }
 else
 {
  hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&m_pVideoCap);
  if (SUCCEEDED(hr))
  {
   hr = m_pGrapher->AddFilter(m_pVideoCap, varFriendName.bstrVal);   
  }
  m_DeviceDescriptName = varDescriptName;
  m_DeviceFriendName = varFriendName;
  pPropBag->Release();
  pMoniker->Release();
  VariantClear(&varDescriptName);
  VariantClear(&varFriendName);

  //
  //hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved, m_pVideoCap,IID_IAMVideoCompression, (void **)&m_pAMVideoCompress);
  //if(hr != S_OK)
  //{
  // hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video, m_pVideoCap,IID_IAMVideoCompression, (void **)&m_pAMVideoCompress);
  //}

  // !!! What if this interface isn't supported?
  // we use this interface to set the frame rate and get the capture size
  hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,m_pVideoCap, IID_IAMStreamConfig, (void **)&m_pAMStreamConfig);

  if(hr != NOERROR)
  {
   hr = m_pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video, m_pVideoCap,IID_IAMStreamConfig, (void **)&m_pAMStreamConfig);
   if(hr != NOERROR)
   {
    // this means we can't set frame rate (non-DV only)
    ErrMsg(TEXT("Error %x: Cannot find VCapture:IAMStreamConfig"), hr);
   }
  }

 }

 //添加Smart tee到Filter graph后,连接到videocapter

 
 hr = m_pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pVideoCap, NULL,m_pSmartTee);
 //hr = m_pBuilder->RenderStream(NULL, &MEDIATYPE_Interleaved, m_pVideoCap, NULL,m_pSmartTee);
 //hr = m_pBuilder->RenderStream(NULL, NULL, m_pVideoCap, NULL,m_pSmartTee);
 return hr;
}

转载于:https://www.cnblogs.com/cngreatwall/archive/2011/09/02/2163542.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//指定视频采集设备的友好名字,为它创建一个Filter IBaseFilter * CTestPreviewDlg::CreateVideoDevice(const char * inFriendlyName) { return CreateHardwareFilter(CLSID_VideoInputDeviceCategory,inFriendlyName); } //根据设备的友好名字,创建一个代表该设备的Filter IBaseFilter * CTestPreviewDlg::CreateHardwareFilter(GUID inCategory,const char * inFriendlyName) { //创建一个系统枚举组件对象 ICreateDevEnum * enumHardware = NULL; HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_ALL, IID_ICreateDevEnum,(void**)&enumHardware); if(FAILED(hr)) { return NULL; } IBaseFilter * hardwareFilter = NULL; IEnumMoniker * enumMoniker = NULL; //为指定的目录创建枚举器 hr = enumHardware->CreateClassEnumerator(inCategory,&enumMoniker,0); if(enumMoniker) { enumMoniker->Reset(); ULONG fetched = 0; IMoniker * moniker = NULL; char friendlyName[256]; //枚举得到该目录下所有的设备,逐个进行名字匹配 while(!hardwareFilter && SUCCEEDED(enumMoniker->Next(1,&moniker, &fetched)) && fetched) { if(moniker) { IPropertyBag * propertyBag = NULL; VARIANT name; friendlyName[0] = 0; hr = moniker->BindToStorage(0,0,IID_IPropertyBag,(void**)&propertyBag); //读取设备的友好名字 if(SUCCEEDED(hr)) { name.vt = VT_BSTR; hr = propertyBag->Read(L"Friendlyname",&name,NULL); } if(SUCCEEDED(hr)) { WideCharToMultiByte(CP_ACP,0,name.bstrVal,-1, friendlyName,256,NULL,NULL); //如果当前设备的友好名字与用户指定的设备名字相同, //则将当前设备标识绑定为Filter形式 if(strcmp(friendlyName,inFriendlyName) == 0) { moniker->BindToObject(0,0,IID_IBaseFilter, (void**)&hardwareFilter); } } //释放使用过的接口 if(propertyBag) { propertyBag->Release(); propertyBag = NULL; } moniker->Release(); } } enumMoniker->Release(); } enumHardware->Release(); return hardwareFilter; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值