Webカメラからの映像取り込み

急にWebカメラから映像を取り込んで遊びたくなりました。

DirectX9用のSDKをみたらDirectShowのライブラリが見つからない、以前8の頃はあったのに・・・・
よくよく調べてみると「Platform SDK」の方に入っているのですね、早速インストール
http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en

そして、まずすることは
C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\BaseClasses
コンパイルです。
コンパイルには「スタート」->「Microsoft Platform SDK for Windows Server 2003 SP1」->「Open Build Environment Window」
の中から自分にあった環境を選択します。
私は「Windows XP 32-bit Build Environment」->「Set Windows XP 32-bit Build Environment (Debug)」を選択しました。
コマンドプロンプトが開くので
>cd C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\BaseClasses
>nmake
をしてコンパイルしてください。「strmiids.lib」が作成されます。

あとはこんな感じでプログラムを書けば、Webカメラからデータを取得できます。
■開始

	IGraphBuilder *pGraphBuilder;
	ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
	IMediaControl *pMediaControl;

	ICreateDevEnum *pCreateDevEnum = NULL;
	IEnumMoniker *pEnumMoniker = NULL;
	IMoniker *pMoniker = NULL;

	ULONG nFetched = 0;
	IBaseFilter *pDeviceFilter;

	CoInitialize(NULL);

	CoCreateInstance(
		CLSID_FilterGraph,
		NULL,
		CLSCTX_INPROC,
		IID_IGraphBuilder,
		(LPVOID *)&pGraphBuilder);

	CoCreateInstance(
		CLSID_CaptureGraphBuilder2, 
		NULL, 
		CLSCTX_INPROC, 
		IID_ICaptureGraphBuilder2, 
		(LPVOID *)&pCaptureGraphBuilder2);

	pCaptureGraphBuilder2->SetFiltergraph(
		pGraphBuilder);

	pGraphBuilder->QueryInterface(
		IID_IMediaControl,
		(LPVOID *)&pMediaControl);

	CoCreateInstance(
		CLSID_SystemDeviceEnum, 
		NULL, 
		CLSCTX_INPROC_SERVER, 
		IID_ICreateDevEnum, 
		(PVOID *)&pCreateDevEnum);
    
	pCreateDevEnum->CreateClassEnumerator( 
		CLSID_VideoInputDeviceCategory,
		&pEnumMoniker,
		0);
	if (pEnumMoniker == NULL) {
	   printf("no device\n");
	   return;
	 }

	pEnumMoniker->Reset();
	pEnumMoniker->Next(1, &pMoniker, &nFetched);

	pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter );
	pGraphBuilder->AddFilter(pDeviceFilter, L"Device Filter");

	pMoniker->Release();
	pEnumMoniker->Release();
	pCreateDevEnum->Release();

	pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW,
		NULL, pDeviceFilter, NULL, NULL);

	// 再生開始
	pMediaControl->Run();

■終了

	pMediaControl->Release();
	pCaptureGraphBuilder2->Release();
	pGraphBuilder->Release();
	// COM終了
	CoUninitialize();