VFW_E_NOT_IN_GRAPH в видеозахвате directshow

Я снова пытаюсь использовать directShow. Я попытался реализовать пример из распространителя камеры для чтения камеры (я хотел бы получать кадры в виде массива байтов) и получаю ошибку VFW_E_NOT_IN_GRAPH при попытке подключить контакты.

Я уже искал и теперь знаю, что это означает, что я не добавил конкретный фильтр в построитель графиков (или фильтр, который я использовал, несовместим?), но я добавил фильтр и не вижу никаких отличий от образца. ... однако образец - это не проект, а только фрагменты кода, поэтому я думаю, что мог забыть какую-либо инициализацию...

Не могли бы вы взглянуть на это и сказать мне, нашли ли вы ошибку? Все работает find без ошибок, просто последний hr заполняется 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 );

Надеюсь, я не забыл какую-либо важную информацию... (Думаю, используя C++-Builder из embarcadero XE2 16 и DirectShow9 из 2005 года)


person Julian    schedule 15.08.2012    source источник


Ответы (1)


Код ошибки говорит вам, что не так. VFW_E_NOT_IN_GRAPH, что-то не так на графике. Вы соединяете два контакта, которые принадлежат двум фильтрам. Один из фильтров отсутствует на графике. Если вы добавите pGrabBase несколькими строками выше, то другого фильтра на графике не будет. Добавьте его также перед подключением штифтов.

person Roman R.    schedule 15.08.2012
comment
Спасибо за быстрый ответ! Итак, вы говорите, что pFilter еще не добавлен в m_pGraphBuilder? Должен ли я использовать m_pGraphBuilder->AddFilter( pFilter, LSnapshot ); для этого? какую строку я должен предоставить там? Или я неверно истолковал вашу помощь? (А как сделать новую строку в комментариях?^^) - person Julian; 15.08.2012
comment
Да, вам нужно добавить оба фильтра (со строкой, которую вы написали выше). Подойдет любая строка — это ваше имя для фильтра. - person Roman R.; 15.08.2012
comment
Еще раз спасибо за ваш ответ! Добавление hr = m_pGraphBuilder->AddFilter( pFilter, LSource ); помогла эта ошибка... но ничего не происходит^^ Как я могу запустить все это или получить кадры (наиболее нужные как Byte-Array)? - person Julian; 15.08.2012
comment
Мой совет: начните с хорошего образца, который работает. С таким Q вы действительно в самом начале пути, будут другие вещи, прежде чем что-то начнет происходить. - person Roman R.; 15.08.2012
comment
Спасибо за совет... У меня все еще есть некоторые проблемы с поиском хороших образцов, так как многие из них используются для предыдущих прямых показов или они пытаются визуализировать объекты... Вы знаете рабочий пример? Лучшее, что я нашел до сих пор, было бы здесь: stackoverflow.com/questions/1827635/ - person Julian; 15.08.2012
comment
Есть образцы прямо в Windows SDK. В более ранних версиях DirectX SDK (2004-2005) есть больше примеров. Примеры есть на CodeProject. Большинство из них - C++ для Visual Studio, ребята из Delphi используют DSPack (не уверен, что это больше подходит для разработки C++ Builder). - person Roman R.; 15.08.2012
comment
Вам нужно кодовое слово SampleCB (или BufferCB), найдите его. Вы найдете несколько образцов для сбора данных. Google использует этот подход для захвата видео в плагине Firefox для GMail. - person Roman R.; 15.08.2012