设为首页 加入收藏

TOP

Visual C++编程实现摄像头视频捕捉(二)
2014-11-23 20:01:00 来源: 作者: 【 】 浏览:52
Tags:Visual 编程 实现 摄像头 视频 捕捉
_szFileName[MAX_PATH];// 位图文件名称
   CSampleGrabberCB( ){
    strcpy(m_szFileName, "c:\donaldo.bmp");
   }
   STDMETHODIMP_(ULONG) AddRef() { return 2; }
   STDMETHODIMP_(ULONG) Release() { return 1; }
   STDMETHODIMP QueryInterface(REFIID riid, void ** ppv){
   if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown ){
    *ppv = (void *) static_cast ( this );
    return NOERROR;
   }
   return E_NOINTERFACE;
  }
  STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample ){
  return 0;
}
STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize ){
  if( !bOneShot )return 0;
 
  if (!pBuffer)return E_POINTER;
  SaveBitmap(pBuffer, lBufferSize);
  bOneShot = FALSE;
  return 0;
}
//创建位图文件
BOOL SaveBitmap(BYTE * pBuffer, long lBufferSize )
{
  HANDLE hf = CreateFile(
  m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
  CREATE_ALWAYS, NULL, NULL );
  if( hf == INVALID_HANDLE_VALUE )return 0;
   // 写文件头
   BITMAPFILEHEADER bfh;
   memset( &bfh, 0, sizeof( bfh ) );
   bfh.bfType = ’MB’;
   bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER );
   bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
   DWORD dwWritten = 0;
   WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
   // 写位图格式
   BITMAPINFOHEADER bih;
   memset( &bih, 0, sizeof( bih ) );
   bih.biSize = sizeof( bih );
   bih.biWidth = lWidth;
   bih.biHeight = lHeight;
   bih.biPlanes = 1;
   bih.biBitCount = 24;
   WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );
   // 写位图数据
   WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );
   CloseHandle( hf );
   return 0;
  }
};
CSampleGrabberCB mCB;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCaptureVideo::CCaptureVideo()
{
  //COM Library Intialization
  if(FAILED(CoInitialize(NULL))) /*, COINIT_APARTMENTTHREADED)))*/
  {
   AfxMessageBox("CoInitialize Failed! ");
   return;
  }
  m_hWnd = NULL;
  m_pVW = NULL;
  m_pMC = NULL;
  m_pGB = NULL;
  m_pCapture = NULL;
}
CCaptureVideo::~CCaptureVideo()
{
  // Stop media playback
  if(m_pMC)m_pMC-> Stop();
  if(m_pVW){
   m_pVW-> put_Visible(OAFALSE);
   m_pVW-> put_Owner(NULL);
  }
  SAFE_RELEASE(m_pCapture);
  SAFE_RELEASE(m_pMC);
  SAFE_RELEASE(m_pGB);
  SAFE_RELEASE(m_pBF);
  CoUninitialize( );
}
int CCaptureVideo::EnumDevices(HWND hList)
{
  if (!hList)
   return -1;
  int id = 0;

  //枚举视频扑捉设备
  ICreateDevEnum *pCreateDevEnum;
  HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);

  if (hr != NOERROR)return -1;
  CComPtr pEm;
  hr = pCreateDevEnum-> CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);

  if (hr != NOERROR)return -1;
  pEm-> Reset();
  ULONG cFetched;
  IMon
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC中ftp协议实现多线程断点续传 下一篇在VC++中实现自动连续播放多媒体..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: