1st step to
understand DirectShow (その3 SampleGrabber) サンプル グラバ
フィルタは変換フィルタで、このフィルタを使ってストリームがフィルタ
グラフを通過するときに // === BEGIN ELEMENTS FROM QEDIT.H === //#include <qedit.h> // From
http://msdn2.microsoft.com/en-us/library/ms786691.aspx: // Include Qedit.h. This header file is not compatible with
Microsoft® Direct3D® headers later than version 7. // Since we are using DX9, we cannot include this header.
Necessary API elements, copied below. EXTERN_C EXTERN_C EXTERN_C MIDL_INTERFACE ISampleGrabberCB public virtual HRESULT STDMETHODCALLTYPE
SampleCB( double
SampleTime,IMediaSample *pSample) =
0; virtual HRESULT STDMETHODCALLTYPE
BufferCB( double
SampleTime,BYTE
*pBuffer,long BufferLen) = 0; }; EXTERN_C MIDL_INTERFACE ISampleGrabber public virtual HRESULT STDMETHODCALLTYPE
SetOneShot( BOOL
OneShot) = 0; virtual HRESULT STDMETHODCALLTYPE
SetMediaType( const
AM_MEDIA_TYPE *pType) = 0; virtual HRESULT STDMETHODCALLTYPE
GetConnectedMediaType( AM_MEDIA_TYPE *pType) =
0; virtual HRESULT STDMETHODCALLTYPE
SetBufferSamples( BOOL BufferThem) = 0; virtual HRESULT STDMETHODCALLTYPE
GetCurrentBuffer( /*
[out][in] */ long *pBufferSize,/* [out] */
long *pBuffer) =
0; virtual HRESULT STDMETHODCALLTYPE
GetCurrentSample( /*
[retval][out] */ IMediaSample **ppSample) = 0; virtual HRESULT STDMETHODCALLTYPE
SetCallback( ISampleGrabberCB *pCallback,long WhichMethodToCallback) = 0; }; // === END ELEMENTS FROM QEDIT.H === . つまり、必要な定義の部分だけを、qedit.hから、抜き出してくる訳ですね。 CoInitialize(NULL); IBaseFilter *pGrabberF = NULL; HRESULT hr = CoCreateInstance(CLSID_SampleGrabber,
NULL, CLSCTX_INPROC_SERVER, if (FAILED(hr)) pGrabber->Release();
1. SampleGrabberとは?
ストリームからメディア サンプルを捕捉できる。
(JPN
MSDN)
これが使えそうです。
もう1つ、見つけました。
SampleGrabberは、qedit.h
をincludeする必要があるのですが、このヘッダーファイルをincludeすると
compileできなくなりました。
それで、MultiMediStreamを、探して、見つけた訳です。
そして、ここにある例をコピーして、buildしたのですが
残念な事に、48KHz
sampling audio
では、うまく作動しませんでした。
ちょっと、ひねれば、動くかもしれません。
それで、再び、SampleGrabberに戻ってきたのです。
2.どうやって、SampleGrabberをcompileできるようになったか
webを探して、いい記事を、見つけました。
試してみましたら、うまく作動しました。
// TODO: Perform any application-level initialization here
IID_IBaseFilter, (void**)&pGrabberF);
{
//
エラーを返す。
}
ISampleGrabber *pGrabber;
hr=pGrabberF->QueryInterface(IID_ISampleGrabber,
(void**)&pGrabber);
pGrabberF->Release();
CoUninitialize();
これなら、DirectX9でも、うまく作動します、いとうれし。
今日は、ここまでです。
H.20.2.29