もう一度、directShow を使用しようとしています。カメラディストリビューターからの例を実装してカメラを読み取ろうとしました (バイト配列の形式でフレームを取得したい)、ピンを接続しようとすると VFW_E_NOT_IN_GRAPH-Error が発生します。
つまり、グラフビルダーに特定のフィルターを追加しなかった (または、使用したフィルターに互換性がない) ことを意味しますが、フィルターを追加しましたが、サンプルとの違いは見られません。 …とはいえ、サンプルはプロジェクトではなく、コードのスクラップだけなので、初期化を忘れている可能性があると思います...
これを見て、間違いがないかどうか教えていただけますか?すべてがエラーなしで機能し、最後の 1 時間だけが 0x8004025F で満たされ、何も起こりません (DoRenderSample メソッド内にストップポイントを作成しました):
HRESULT hr = S_OK;
IBaseFilter* pFilter=0;
hr=CreateKernelFilter(
CLSID_VideoInputDeviceCategory,
L"Videology USB-C Camera",
&pFilter
);
CoInitialize(NULL);
// CComQIPtr<IVideology20K1XX> pKs(pFilter);
CComQIPtr<IVideologyCommon> pKs( pFilter );
if(pFilter==0)return;
// hr=pKs->SetWhiteBalanceMode(wbAuto);
CBitmapRenderer *m_pSnapshotter = new CBitmapRenderer( _T("Bitmap renderer"), NULL, &hr );
if( FAILED(hr) )
{
ASSERT("Couldn't create bitmap renderer.");
return;
}
m_pSnapshotter->SetCallback( (IBitmapCallback*) this );
CComQIPtr< IBaseFilter > pGrabBase( m_pSnapshotter );
IGraphBuilder* m_pGraphBuilder=0;
hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGraphBuilder);
hr = m_pGraphBuilder->AddFilter( pGrabBase, L"Snapshot" );
CComPtr<IPin> pOutPin;
hr= pFilter->FindPin( L"1", &pOutPin );
CBasePin* pInPin = m_pSnapshotter->GetPin( 0 );
hr = m_pGraphBuilder->Connect( pOutPin, pInPin );
重要な情報を忘れていないことを願っています... (embarcadero XE2 16 の C++-Builder と 2005 年の DirectShow9 を使用していると思います)