1

もう一度、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 を使用していると思います)

4

1 に答える 1

1

エラーコードは、何が間違っているかを示します。VFW_E_NOT_IN_GRAPH、何かがグラフにありません。2 つのフィルターに属する 2 つのピンを接続します。フィルタの 1 つがグラフにありません。pGrabBase上記の数行を追加すると、他のフィルターはグラフに表示されません。ピンを接続する前にも追加します。

于 2012-08-15T10:53:08.807 に答える