パソコン関連のメモとして色々書いていきます。
カレンダー
04 | 2024/05 | 06 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
ブログ内検索
読み込みで特殊な物↓ 過去を参考にファイルを作成
#include <qedit.h> // SampleGrabber用
次に
戻り値は基本的に S_ で始まるため、エラーが帰ってこないらしい//COMの初期化?CoInitialize(NULL);
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を利用した後、バッファからデータを取得するように変更する
TRUEでデータを取得し、FALSEで取得しないため、不要であればOFFにするpSampleGrabber->SetBufferSamples(TRUE);
ここまでが取得// 接続情報取得。
// この処理は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
PR
この記事にコメントする
最新記事
(10/18)
(10/18)
(10/18)
(10/18)
(10/11)
(09/27)
(09/24)
(09/18)
(09/14)
(09/13)
(09/13)
(09/13)
(09/13)
(09/12)
(09/12)
(09/12)
(09/12)
(09/12)
(09/12)
(09/12)
(09/06)
(09/06)
(09/04)
(09/04)
(09/03)