亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? capturevideo.cpp

?? 簡單的攝像頭控制程序(支持無驅) 支持截取視頻并保存
?? CPP
字號:
//-------------------------------------------------------------------
// CCaptureVideo視頻捕捉類實現(xiàn)文件CaptureVideo.cpp
//-------------------------------------------------------------------
// CaptureVideo.cpp: implementation of the CCaptureVideo class.
//
/////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CaptureVideo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
BOOL bOneShot=FALSE;//全局變量
class CSampleGrabberCB : public ISampleGrabberCB 
{
public:
	long lWidth;
	long lHeight;
	TCHAR m_szFileName[MAX_PATH];// 位圖文件名稱
	CSampleGrabberCB( )
	{
		StringCchCopy(m_szFileName,sizeof(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<ISampleGrabberCB*> ( 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;
	}
	//創(chuàng)建位圖文件
	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 );
		// 寫位圖數(shù)據
		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!\r\n"); 
		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);
	}
	srelease(m_pCapture);
	srelease(m_pMC);
	srelease(m_pGB);
	srelease(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<IEnumMoniker> pEm;
	hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);
	if (hr != NOERROR)return -1;
	pEm->Reset();
	ULONG cFetched;
	IMoniker *pM;
	while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
	{
		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) 
			{
				TCHAR str[2048]; 
				id++;
				WideCharToMultiByte(CP_ACP,0,var.bstrVal, -1, str, 2048, NULL, NULL);
				::SendMessage(hList, CB_ADDSTRING, 0,(LPARAM)str);
				SysFreeString(var.bstrVal);
			}
			pBag->Release();
		}
		pM->Release();
	}
	return id;
}

HRESULT CCaptureVideo::Init(int iDeviceID, HWND hWnd)
{
	HRESULT hr;
	hr = InitCaptureGraphBuilder();
	if (FAILED(hr))
	{
		AfxMessageBox("Failed to get video interfaces!");
		return hr;
	}
	// Bind Device Filter. We know the device because the id was passed in
	if(!BindFilter(iDeviceID, &m_pBF))return S_FALSE;
	hr = m_pGB->AddFilter(m_pBF, L"Capture Filter");
	// hr = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
	// m_pBF, NULL, NULL);
	// create a sample grabber
	hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
	if( !m_pGrabber )
	{
		AfxMessageBox("Fail to create SampleGrabber, maybe qedit.dll is not registered?");
		return hr;
	}
	CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );
	//設置視頻格式
	AM_MEDIA_TYPE mt; 
	ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
	mt.majortype = MEDIATYPE_Video;
	mt.subtype = MEDIASUBTYPE_RGB24;
	hr = m_pGrabber->SetMediaType(&mt);

	if( FAILED( hr ) )
	{
		AfxMessageBox("Fail to set media type!");
		return hr;
	}
	hr = m_pGB->AddFilter( pGrabBase, L"Grabber" );
	if( FAILED( hr ) )
	{
		AfxMessageBox("Fail to put sample grabber in graph");
		return hr;
	}

	// try to render preview/capture pin
	hr = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
	if( FAILED( hr ) )
	hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);

	if( FAILED( hr ) )
	{
		AfxMessageBox("Can’t build the graph");
		return hr;
	}

	hr = m_pGrabber->GetConnectedMediaType( &mt );
	if ( FAILED( hr) )
	{
		AfxMessageBox("Failt to read the connected media type");
		return hr;
	}

	VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
	mCB.lWidth = vih->bmiHeader.biWidth;
	mCB.lHeight = vih->bmiHeader.biHeight;
	FreeMediaType(mt);
	hr = m_pGrabber->SetBufferSamples( FALSE );
	hr = m_pGrabber->SetOneShot( FALSE );
	hr = m_pGrabber->SetCallback( &mCB, 1 );

	//設置視頻捕捉窗口
	m_hWnd = hWnd ; 
	SetupVideoWindow();
	hr = m_pMC->Run();//開始視頻捕捉
	if(FAILED(hr))
	{
		AfxMessageBox("Couldn’t run the graph!");
		return hr;
	}
	return S_OK;
}
bool CCaptureVideo::BindFilter(int deviceId, IBaseFilter **pFilter)
{
	if (deviceId < 0) return false;

	// enumerate all video capture devices
	CComPtr<ICreateDevEnum> pCreateDevEnum;
	HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
	IID_ICreateDevEnum, (void**)&pCreateDevEnum);
	if (hr != NOERROR) return false;
	CComPtr<IEnumMoniker> pEm;
	hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);
	if (hr != NOERROR) return false;
	pEm->Reset();
	ULONG cFetched;
	IMoniker *pM;
	int index = 0;
	while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK, index <= deviceId)
	{
		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) 
			{
				if (index == deviceId)
				{
					pM->BindToObject(0, 0, IID_IBaseFilter, (void**)pFilter);
				}
				SysFreeString(var.bstrVal);
			}			
			pBag->Release();
		}
		pM->Release();
		index++;
	}
	return true;
}

HRESULT CCaptureVideo::InitCaptureGraphBuilder()
{
	HRESULT hr;

	// 創(chuàng)建IGraphBuilder接口
	hr=CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGB);
	// 創(chuàng)建ICaptureGraphBuilder2接口
	hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
	IID_ICaptureGraphBuilder2, (void **) &m_pCapture);
	if (FAILED(hr))return hr;
	m_pCapture->SetFiltergraph(m_pGB);
	hr = m_pGB->QueryInterface(IID_IMediaControl, (void **)&m_pMC);
	if (FAILED(hr))return hr;
	hr = m_pGB->QueryInterface(IID_IVideoWindow, (LPVOID *) &m_pVW);
	if (FAILED(hr))return hr;
	return hr;
}
HRESULT CCaptureVideo::SetupVideoWindow()
{
	HRESULT hr;
	hr = m_pVW->put_Owner((OAHWND)m_hWnd);
	if (FAILED(hr))return hr;
	hr = m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
	if (FAILED(hr))return hr;
	ResizeVideoWindow();
	hr = m_pVW->put_Visible(OATRUE);
	return hr;
}
void CCaptureVideo::ResizeVideoWindow()
{
	if (m_pVW)
	{
		//讓圖像充滿整個窗口
		CRect rc;
		::GetClientRect(m_hWnd,&rc);
		m_pVW->SetWindowPosition(0, 0, rc.right, rc.bottom);
	} 
}
void CCaptureVideo::GrabOneFrame(BOOL bGrab)
{
	bOneShot = bGrab;
}
void CCaptureVideo::FreeMediaType(AM_MEDIA_TYPE& mt)
{
	if (mt.cbFormat != 0) 
	{
		CoTaskMemFree((PVOID)mt.pbFormat);
		// Strictly unnecessary but tidier
		mt.cbFormat = 0;
		mt.pbFormat = NULL;
	}
	if (mt.pUnk != NULL) 
	{
		mt.pUnk->Release();
		mt.pUnk = NULL;
	}
} 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美片网站yy| 日韩精品一二三区| 天天射综合影视| 国产91精品免费| 欧美日本国产视频| 亚洲欧美综合另类在线卡通| 蜜臀99久久精品久久久久久软件| av高清不卡在线| www亚洲一区| 爽好久久久欧美精品| bt欧美亚洲午夜电影天堂| 日韩欧美中文一区二区| 亚洲国产色一区| 色婷婷亚洲精品| 亚洲欧洲色图综合| 97久久超碰精品国产| 国产农村妇女毛片精品久久麻豆 | 欧美二区三区的天堂| 综合av第一页| 国产成人在线免费观看| 91精品国产91热久久久做人人| 亚洲精品videosex极品| 不卡一二三区首页| 中文在线资源观看网站视频免费不卡| 日韩黄色免费网站| 欧美日韩久久久| 久久久精品人体av艺术| 天堂成人免费av电影一区| 欧美精品成人一区二区三区四区| 中文字幕一区二区三区精华液| 日本成人中文字幕在线视频| 色综合天天在线| 国产精品网站在线| 国产精品一区在线| 欧美成人一区二区| 日韩国产在线观看| 一本色道久久综合亚洲精品按摩| 日本一区二区在线不卡| 国产一区二区免费在线| 日韩欧美一区中文| 日本午夜精品视频在线观看| 欧美日韩国产不卡| 五月婷婷综合网| 欧美精选一区二区| 亚洲欧洲另类国产综合| 国产成人av电影在线观看| 精品久久久久一区二区国产| 免费的成人av| 日韩欧美一区在线| 人人精品人人爱| 日韩午夜精品电影| 免费日本视频一区| 精品久久久三级丝袜| 国产一区不卡在线| 国产精品理论在线观看| av在线一区二区| 亚洲精品少妇30p| 欧美亚洲动漫制服丝袜| 亚洲成人久久影院| 日韩一级免费观看| 激情国产一区二区| 精品国产91乱码一区二区三区| 亚洲成人免费视| 在线一区二区三区四区五区| 亚洲国产视频在线| 91精品国产黑色紧身裤美女| 久99久精品视频免费观看| 久久综合九色综合久久久精品综合| 国产真实乱偷精品视频免| 久久一二三国产| www.欧美.com| 亚洲成人高清在线| 26uuu亚洲| 国产乱码精品一区二区三区忘忧草| 中文天堂在线一区| 欧美写真视频网站| 国产一区二区伦理| 亚洲人吸女人奶水| 欧美一区二区三区不卡| 捆绑调教美女网站视频一区| 中文av一区二区| 欧美美女直播网站| 高清久久久久久| 天堂影院一区二区| 中文字幕 久热精品 视频在线 | 国产99久久久国产精品潘金| 久久久综合精品| 欧美在线观看18| 国产91丝袜在线播放0| 亚洲国产一区二区三区青草影视| 欧美tickling挠脚心丨vk| 99视频超级精品| 蜜臀精品久久久久久蜜臀| 综合亚洲深深色噜噜狠狠网站| 欧美一区二区三区婷婷月色 | 一区二区三区在线观看视频| 欧美一区日本一区韩国一区| 97超碰欧美中文字幕| 九色porny丨国产精品| 一区二区视频在线看| 2021国产精品久久精品| 欧美日韩中文国产| 97se亚洲国产综合自在线| 久草中文综合在线| 日韩福利视频网| 一区二区三区四区精品在线视频| 久久久www成人免费无遮挡大片| 欧美性做爰猛烈叫床潮| 99国产精品99久久久久久| 亚洲18女电影在线观看| 国产精品无人区| www国产成人免费观看视频 深夜成人网| 在线看日本不卡| 99视频一区二区三区| 成人做爰69片免费看网站| 美腿丝袜在线亚洲一区| 一区二区三区精品| 国产精品无人区| 国产欧美一区二区精品婷婷| 日韩精品一区二区三区蜜臀| 欧美日韩激情一区| 欧美三级中文字幕在线观看| 成人黄色777网| 国产美女视频一区| 久久精品国产色蜜蜜麻豆| 琪琪一区二区三区| 天堂久久久久va久久久久| 亚洲视频每日更新| 中文在线一区二区| 国产精品福利一区| 亚洲人成精品久久久久久| 亚洲色图清纯唯美| 亚洲乱码中文字幕综合| 亚洲一区二区三区四区五区黄| 一区二区三区在线观看欧美| 亚洲精品五月天| 亚洲高清免费视频| 日韩成人伦理电影在线观看| 日本一区中文字幕| 国内精品伊人久久久久av一坑| 韩国女主播成人在线| 国产成人av影院| 国产超碰在线一区| 在线观看免费成人| 91精品国产综合久久婷婷香蕉 | 波多野结衣中文一区| 成人免费观看av| 99精品久久99久久久久| 91福利精品第一导航| 欧美一区二区在线播放| 欧美精品一区二区久久久| 国产午夜精品一区二区三区嫩草| 欧美成人a∨高清免费观看| 精品国产成人在线影院| 亚洲乱码中文字幕综合| 免费观看久久久4p| 成人看片黄a免费看在线| 日本大香伊一区二区三区| 日韩午夜在线观看视频| 国产精品久久久久久亚洲伦 | 欧美xxxxxxxx| 中文字幕一区二区三区av| 亚洲h动漫在线| 国产剧情一区在线| 91高清视频在线| 欧美一二三在线| 久久久www成人免费毛片麻豆| 亚洲欧美激情视频在线观看一区二区三区 | 成人一区在线观看| 欧美日本一区二区三区| 欧美激情综合五月色丁香小说| 亚洲男人天堂一区| 极品销魂美女一区二区三区| jizz一区二区| 精品剧情在线观看| 亚洲国产一区二区三区青草影视| 国内不卡的二区三区中文字幕 | 亚洲欧美日韩国产成人精品影院| 肉肉av福利一精品导航| 粉嫩一区二区三区在线看| 欧美日韩免费在线视频| 欧美激情综合在线| 精品一区二区三区在线观看| 91国模大尺度私拍在线视频| 日韩午夜在线影院| 亚洲国产日韩一区二区| 成人免费看片app下载| 精品免费国产二区三区| 亚洲一区二区三区四区不卡 | 亚洲1区2区3区视频| 不卡视频免费播放| 国产亚洲成av人在线观看导航| 视频一区视频二区中文| 91亚洲永久精品| 精品国产乱码久久久久久久久| 性欧美疯狂xxxxbbbb| 色欲综合视频天天天| 日本一区二区三区免费乱视频| 青青青伊人色综合久久| 97精品视频在线观看自产线路二|