Я снова пытаюсь использовать 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 года)