Webカメラからの映像取り込み(その2)

やっぱ、1台のPCで複数のWebカメラを制御したくなりました。

■開始

	IGraphBuilder	*pGraph;
	IMediaControl	*pMC;
	ICaptureGraphBuilder2	*pCapture[ 10 ];
	IBaseFilter	*pbf[ 10 ];
	ULONG	cFetched;

	int		i;
	IMoniker	*pMoniker[10];
	ICreateDevEnum	*pDevEnum;
	IEnumMoniker * pClassEnum;

	pClassEnum	= NULL;
	// COMを初期化
	CoInitialize(NULL);

	// FilterGraphを生成
	CoCreateInstance(
		CLSID_SystemDeviceEnum,
		NULL,
		CLSCTX_INPROC,
		IID_ICreateDevEnum,
		(LPVOID *)&pDevEnum);
	//----------------
	pDevEnum->CreateClassEnumerator( 
		CLSID_VideoInputDeviceCategory,
		&pClassEnum,
		0 );
	if( pClassEnum == NULL ){
		//	カメラがないよ
		pDevEnum->Release();
		CoUninitialize();
		return;
	}
	//-----------------------------------------------------------------------
	//
	pClassEnum->Next( 10, pMoniker, &cFetched );
	for( i = 0 ; i < cFetched ; i++ ){
		pMoniker[ i ]->BindToObject( 0, 0, IID_IBaseFilter, (void**)&pbf[ i ] );
		pMoniker[ i ]->Release();
	}
	pDevEnum->Release();
	pClassEnum->Release();
	//-----------------------------------------------------------------------
	//	
	pGraph	= NULL;
	pMC		= NULL;
	//-----------------
	CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC,
		IID_IGraphBuilder, (void**)&pGraph );
	pGraph->QueryInterface( IID_IMediaControl, (LPVOID*)&pMC );
	//-----------------
	for( i = 0 ; i < cFetched ; i++ ){
		pGraph->AddFilter( pbf[ i ], L"Video Device" );
	}
	//-----------------------------------------------------------------------
	//	カメラを起動
	for( i = 0 ; i < cFetched ; i++ ){
		CoCreateInstance( CLSID_CaptureGraphBuilder2,
			NULL,
			CLSCTX_INPROC,
			IID_ICaptureGraphBuilder2,
			(void**)&pCapture[ i ] );
		pCapture[ i ]->SetFiltergraph( pGraph );
		pCapture[ i ]->RenderStream( NULL, NULL,
			pbf[ i ], NULL, NULL );
	}
	pMC->Run();

■終了

	pMC->Stop();
	for( i = 0 ; i < cFetched ; i++ ){
		pCapture[ i ]->Release();
		pbf[ i ]->Release();

	}
	pMC->Release();
	pGraph->Release();

	
	// COM終了
	CoUninitialize();

ただ、注意してください使用しているWebカメラのによっては、複数を同時に扱おうとすると
「USBコントローラの大域の過多」とかエラーがでて1個しか制御できないときもあります。