我再次尝试使用directShow。我尝试实现相机分配器的示例来读取相机(我想以字节数组的形式获取帧),并且在尝试连接引脚时遇到VFW_E_NOT_IN_GRAPH错误。
我已经搜索过,现在知道,这意味着,我没有向图形生成器添加特定的过滤器(或者我使用的过滤器不兼容?),但我添加了一个过滤器并且看不到样本的任何差异......但是,该示例不是一个项目,而只是代码碎片,所以我想我可能忘记了任何初始化......
你能看看这个,告诉我你是否发现错误吗?一切都可以正常工作,没有错误,只是最后一个小时充满了0x8004025F,什么也没发生(我在 DoRenderSample-method中做了一个停止点):
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和2005年的DirectShow9的C++-Builder)
错误代码告诉您出了什么问题。 VFW_E_NOT_IN_GRAPH
,有些东西不在图表中。您连接两个引脚,它们属于两个筛选器。其中一个筛选器不在图形中。当您在上面添加pGrabBase
几行时,另一个过滤器不在图表中。在连接引脚之前也添加它。