webcam摄像头采集遇到问题

/*
 * WengoPhone, a voice over Internet phone
 * Copyright (C) 2004-2006  Wengo
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

//#include "IWebcamDriver.h"
#include "DirectXWebcamDriver.h"
#include "pixertool/directx-pixertool.h"

//#include <list>
//#include <string>
#include <comutil.h>

#pragma comment(lib, "comsupp.lib")


//#include <util/Logger.h>

using namespace std;

#define SAFE_RELEASE_POINTER(x) { if (x) x->Release(); x = NULL; }
#define SAFE_RELEASE(x) { if (x) x.Release(); x = NULL; }

//CComBSTR aaa("aaa");

 

 

HRESULT AddDevicesToList(HWND hlist)
{
 HRESULT hr;
 //create an enumerator
 CComPtr<ICreateDevEnum> pCreateDevEnum;
 pCreateDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum);
 if ( !pCreateDevEnum)
 {
  return S_FALSE;
 }

 //enumerate video capture devices
 CComPtr<IEnumMoniker > pEnumMoniker;
 pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0);
 if (!pEnumMoniker)
 {
  return S_FALSE;
 }

 pEnumMoniker->Reset();
 //go through and find all video capture device(s)
 ULONG cFetched;
 IMoniker *pM;
 while (hr = pEnumMoniker->Next(1, &pM, &cFetched), hr == S_OK)
 {
  CComPtr<IPropertyBag> pBag;
  hr = pM->BindToStorage( 0,0, IID_IPropertyBag, (void **)&pBag);
  if (SUCCEEDED (hr))
  {
   VARIANT var;
   var.vt = VT_BSTR;
   hr =pBag->Read( L"FriendlyName", &var, NULL);
   if ( hr == NOERROR)
   {
    USES_CONVERSION;
    if (hlist)
     ::SendMessage(hlist, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>((LPCTSTR)W2T(var.bstrVal)));
    SysFreeString( var.bstrVal);
   }
  }
  pM->Release();
 }

 if (hlist)
  ::SendMessage(hlist, CB_SETCURSEL, 0, 0);

 return S_OK;
}

HRESULT AddDevicesToList(std::list<std::wstring>& cam_list)
{
 HRESULT hr;
 std::wstring strCamDevice =L"";

 //create an enumerator
 CComPtr<ICreateDevEnum> pCreateDevEnum;
 pCreateDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum);
 if ( !pCreateDevEnum)
 {
  return S_FALSE;
 }

 //enumerate video capture devices
 CComPtr<IEnumMoniker > pEnumMoniker;
 pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumMoniker, 0);
 if (!pEnumMoniker)
 {
  return S_FALSE;
 }

 pEnumMoniker->Reset();
 //go through and find all video capture device(s)
 ULONG cFetched;
 IMoniker *pM;
 while (hr = pEnumMoniker->Next(1, &pM, &cFetched), hr == S_OK)
 {
  CComPtr<IPropertyBag> pBag;
  hr = pM->BindToStorage( 0,0, IID_IPropertyBag, (void **)&pBag);
  if (SUCCEEDED (hr))
  {
   VARIANT var;
   var.vt = VT_BSTR;
   hr =pBag->Read( L"FriendlyName", &var, NULL);
   if ( hr == NOERROR)
   {
    USES_CONVERSION;
    strCamDevice= (LPCTSTR)W2T(var.bstrVal);
    SysFreeString( var.bstrVal);

    cam_list.push_back(strCamDevice);
   }
  }
  pM->Release();
 }

 return S_OK;
}

HRESULT FindMyCaptureDevice (IBaseFilter **pF, BSTR bstrName)
{
 HRESULT hr= E_FAIL;
 CComPtr< IBaseFilter > pFilter;
 CComPtr<ICreateDevEnum > pSysDevEnum;
 CComPtr<IEnumMoniker> pEnumCat = NULL;

 //create the system enumerator
 pSysDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum);
 if (!pSysDevEnum)
 {
  return E_FAIL;
 }

 //Obtain a class enumerator for the video compressor category
 pSysDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
 if (!pEnumCat )
 {
  return E_FAIL;
 }

 pEnumCat->Reset();

 while (true) {
  CComPtr <IMoniker > pMoniker;
  ULONG cFetched;
  CComPtr<IPropertyBag > pProp;

  HRESULT hr_work = pEnumCat->Next (1, &pMoniker, &cFetched);
  if (hr_work != S_OK)
  {
   break;
  }

  hr = pMoniker->BindToStorage (0, 0, IID_IPropertyBag, (void **)&pProp);
  if (hr != S_OK)
  {
   continue;
  }

  VARIANT varName;
  VariantInit( &varName);
  hr = pProp->Read (L"FriendlyName", &varName, 0);
  if (SUCCEEDED (hr) && wcscmp (bstrName, varName.bstrVal) == 0) {
   hr = pMoniker->BindToObject (0, 0, IID_IBaseFilter, (void **)& pFilter);
   break;
  }

  VariantClear( &varName);
  pMoniker = NULL; //Release for the next loop;
 }
 if ( pFilter) {
  *pF = pFilter;
  (*pF)->AddRef(); //add ref on the way out.
 }

 return hr;

}

IAMStreamConfig *GetIAMStreamConfig (IBaseFilter * pFilter)
{
 IEnumPins *pEnum= NULL;
 HRESULT hr = pFilter->EnumPins(&pEnum);
 if ( FAILED (hr))
  return NULL;

 IPin *pPin= NULL;
 while (pEnum->Next(1, &pPin, NULL) == S_OK)
 {
  IAMStreamConfig *pIAMS = NULL;
  hr = pPin->QueryInterface (IID_IAMStreamConfig, (void **)&pIAMS);
  if ( SUCCEEDED (hr) )
  {
   return pIAMS;
  }
  pPin->Release();
 }
 pEnum->Release();

 return NULL;
}


DirectXWebcamDriver::DirectXWebcamDriver(int flags,int nWidth,int nHeight)
 : IWebcamDriver(flags)
{
 Init();
 
 _desiredWidth= nWidth;
 _desiredHeight = nHeight;

 _hSharedMemoryReadThread = NULL;
 _hSharedMemoryReadFile = NULL;
 _hSharedMemoryWriteFile = NULL;
 _hSharedMemoryLock = NULL;
 _isStartCaptured = FALSE;
}

DirectXWebcamDriver::~DirectXWebcamDriver()
{
  UnInit();
}

void DirectXWebcamDriver::Init()
{
 //FIXME does not work because of Qt4.1.2
 //CoInitializeEx(NULL, COINIT_MULTITHREADED);
 CoInitialize(NULL);

 _isOpen = false;
 _isCaptureGraphBuild = false;
 _isRunning =false;

 //_webcamDriver = driver;
 _pGrabberF = NULL;
 _pGrabber = NULL;
 _pNu

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
虚拟摄像头是指利用软件技术模拟出一个虚拟的摄像头设备,在电脑中生成图像或视频流,并可以被其他应用程序所调用和使用。webcam虚拟摄像头源码则是实现这一功能的代码。 首先,webcam虚拟摄像头源码需要通过调用系统的视频捕获接口,获取真实摄像头的图像或视频流数据。可以利用一些开源的视频捕获库,如OpenCV、DirectShow等,来对摄像头进行初始化,并获取实时的视频数据流。 其次,源码需要创建一个虚拟摄像头设备,可以通过虚拟设备驱动程序来实现。这个虚拟设备可以被操作系统认为是一个真实的摄像头设备,其他应用程序可以通过驱动程序读取这个设备的数据。 接着,源码需要将获取到的真实摄像头的图像或视频数据流传输给虚拟设备,以模拟出虚拟摄像头的图像或视频流。可以利用图像处理算法对真实摄像头的数据进行处理,如实时的图像滤波、颜色调整等,然后将处理后的图像数据传输给虚拟设备。 最后,源码需要对外提供接口,以便其他应用程序可以调用并使用虚拟摄像头。可以通过网络协议,如RTSP、HTTP等,将虚拟摄像头的图像或视频流传输给其他应用程序,实现实时的视频传输。 总之,webcam虚拟摄像头源码是通过调用系统的视频捕获接口,创建虚拟摄像头设备,并将真实摄像头的图像或视频流数据传输给虚拟设备,最终以接口方式提供给其他应用程序使用的代码实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值