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個しか制御できないときもあります。