忍者ブログ
Admin / Write / Res
パソコン関連のメモとして色々書いていきます。
カレンダー
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
ブログ内検索
[23]  [22]  [21]  [20]  [19]  [18]  [17]  [16]  [15]  [14]  [13
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

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

#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

PR
この記事にコメントする
Name
Title
Color
Mail
URL
Comment
Password   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
secret (管理人にのみ表示)
この記事へのトラックバック
この記事にトラックバックする:
Copyright ©  メモメモプログラム All Rights Reserved.
* material by Pearl Box   * Template by tsukika

忍者ブログ [PR]