雷って幻想的だよね?

宗教:C++、C#、ラノベ好きの戯言です。

SampleGraphBuilder


読み込みで特殊な物↓ 過去を参考にファイルを作成




#include <qedit.h> // SampleGrabber用




次に




//COMの初期化?


CoInitialize(NULL);


戻り値は基本的に S_ で始まるため、エラーが帰ってこないらしい



RenderFileを利用する前に以下のことを行っておく




// SampleGrabber(Filter)を生成



CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC, IID_IBaseFilter, (LPVOID *)&pSampleGrabberFilter);


 


// FilterからISampleGrabberインターフェースを取得します


pSampleGrabberFilter->QueryInterface(IID_ISampleGrabber, (LPVOID *)&pSampleGrabber);


 


// SampleGrabberを接続するフォーマットを指定。


// ここがポイントです。


// ここの指定の仕方によりSampleGrabberの挿入箇所を


// 決定できます。このサンプルのような指定をすると


// 画面出力の寸前でサンプルを取得できます。


AM_MEDIA_TYPE am_media_type;


ZeroMemory(&am_media_type, sizeof(am_media_type));


am_media_type.majortype = MEDIATYPE_Video;


am_media_type.subtype = MEDIASUBTYPE_RGB24;


am_media_type.formattype = FORMAT_VideoInfo;


pSampleGrabber->SetMediaType(&am_media_type);


 


// GraphにSampleGrabber Filterを追加


pGraphBuilder->AddFilter(pSampleGrabberFilter,L"Sample Grabber");




RenderFileを利用した後、バッファからデータを取得するように変更する


pSampleGrabber->SetBufferSamples(TRUE);



TRUEでデータを取得し、FALSEで取得しないため、不要であればOFFにする




// 接続情報取得。



// この処理はRenderFileによりGraphが構成された後に


// 行う必要があります。


AM_MEDIA_TYPE am_media_type;


pSampleGrabber->GetConnectedMediaType(&am_media_type);


VIDEOINFOHEADER *pVideoInfoHeader =(VIDEOINFOHEADER *)am_media_type.pbFormat;


 


// バッファを用意


// 必要なバッファサイズを取得


long nBufferSize = 0;


pSampleGrabber->GetCurrentBuffer(&nBufferSize,NULL);


 


long *pBuffer = (long *)malloc(nBufferSize);


 


// 現在表示されている映像を静止画として取得


pSampleGrabber->GetCurrentBuffer(&nBufferSize,pBuffer);


ここまでが取得



以下は取得できているテストのため、利用する





//


// Bitmapに保存。


// このサンプルではキャプチャ結果を見るために


// Bitmapに保存しています。


//


HANDLE fh;


BITMAPFILEHEADER bmphdr;


DWORD nWritten;


 


memset(&bmphdr, 0, sizeof(bmphdr));


 


bmphdr.bfType = ('M' << 8) | 'B';


bmphdr.bfSize = sizeof(bmphdr) + sizeof(BITMAPINFOHEADER) + nBufferSize;


bmphdr.bfOffBits = sizeof(bmphdr) + sizeof(BITMAPINFOHEADER);


 


fh = CreateFile( L"result.bmp",GENERIC_WRITE, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);


WriteFile(fh, &bmphdr, sizeof(bmphdr), &nWritten, NULL);


WriteFile(fh,&pVideoInfoHeader->bmiHeader,sizeof(BITMAPINFOHEADER), &nWritten, NULL);


WriteFile(fh, pBuffer, nBufferSize, &nWritten, NULL);


CloseHandle(fh);




どちらの処理をしていても、以下の処理でメモリを解放しておくこと


free(pBuffer);






Geekなページのサンプルをほぼそのまま利用

http://www.geekpage.jp/programming/directshow/samplegrabber.php