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