📄 camera.cpp
字号:
#include "stdafx.h"
#include "Camera.h"
#include "PropertyBag.h"
STDAPI VarBstrCmp(BSTR bstrLeft, BSTR bstrRight, LCID lcid, ULONG dwFlags) // dwFlags passed to CompareString
{
int nRet = wcscmp(bstrLeft, bstrRight);
return (nRet == 0) ? VARCMP_EQ : (nRet > 0 ? VARCMP_GT : VARCMP_LT);
}
/**********************************************************************************************
* Get camera driver
**********************************************************************************************
* It is possible to use other search types, but using the device class GUID is the most reliable
* way to find a capture device. Once you have obtained a search handle from FindFirstDevice,
* you can make successive calls to FindNextDevice to locate all of the available capture devices.
*
*/
HRESULT CCamera::GetFirstCameraDriver( WCHAR *pwzName )
{
HRESULT hr = S_OK;
HANDLE handle = NULL;
DEVMGR_DEVICE_INFORMATION di;
GUID guidCamera = { 0xCB998A05, 0x122C, 0x4166, 0x84, 0x6A, 0x93, 0x3E, 0x4D, 0x7E, 0x3C, 0x86 };
if( pwzName == NULL ) {
return E_POINTER;
}
di.dwSize = sizeof(di);
handle = FindFirstDevice( DeviceSearchByGuid, &guidCamera, &di );
if(( handle == NULL ) || ( di.hDevice == NULL )) {
hr = HRESULT_FROM_WIN32( GetLastError() );
goto Cleanup;
}
StringCchCopy( pwzName, MAX_PATH, di.szLegacyName );
Cleanup:
FindClose( handle );
return hr;
}
HRESULT CCamera::GetCameraCaptureFilter(IBaseFilter **ppCaptureFilter, WCHAR *pwzName)
{
HRESULT hr = E_FAIL;
CComPtr<IBaseFilter> pVideoCap;
CComPtr<IPersistPropertyBag> pPropertyBag;
// Initialize the video capture filter
hr = pVideoCap.CoCreateInstance( CLSID_VideoCapture );
hr = pVideoCap.QueryInterface( &pPropertyBag );
CPropertyBag PropBag;
CComVariant varCamName = pwzName;
if(( varCamName.vt == VT_BSTR ) == NULL )
{
return E_OUTOFMEMORY;
}
PropBag.Write( L"VCapName", &varCamName );
hr = pPropertyBag->Load( &PropBag, NULL );
ATLASSERT(SUCCEEDED(hr));
*ppCaptureFilter = pVideoCap.Detach();
return S_OK;
}
HRESULT CCamera::InitCaptureGraph()
{
HRESULT hr = E_FAIL;
hr = GetCameraCaptureFilter(&m_pVideoCapture, m_bstrCameraName);
ATLASSERT(hr == S_OK);
if(hr != S_OK)
return E_FAIL;
// Create the Filter Graph Manager.
hr = m_pGraph.CoCreateInstance(CLSID_FilterGraph);
ATLASSERT(m_pGraph != NULL);
hr = m_pGraph->AddFilter( m_pVideoCapture, L"Video capture source" );
ATLASSERT(hr == S_OK);
// Create the Capture Graph Builder.
hr = m_pGraphBuilder2.CoCreateInstance(CLSID_CaptureGraphBuilder);
ATLASSERT(hr == S_OK);
hr = m_pGraphBuilder2->SetFiltergraph(m_pGraph);
ATLASSERT(SUCCEEDED(hr));
if(FAILED(hr))
return E_FAIL;
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -