C++ directShow中出现死锁,多个视频调整大小
我想同时播放9个视频。 2、我有一个主线程,它创建所有窗口并处理WM_*消息,还负责:a、init vmrvideorender9、MediaControl B、connect filter C、停止并释放MediaControl。等等。 3、对于每个视频,还有一个用于发送样本的渲染线程 现在,我有很多死锁,它们挂在不同的地方,CPU非常高。 死锁通常发生在调整窗口大小时。 例如:当我调用下面的函数时,有时它会占用40秒,有时它只是挂在函数内部C++ directShow中出现死锁,多个视频调整大小,c++,video,directshow,C++,Video,Directshow,我想同时播放9个视频。 2、我有一个主线程,它创建所有窗口并处理WM_*消息,还负责:a、init vmrvideorender9、MediaControl B、connect filter C、停止并释放MediaControl。等等。 3、对于每个视频,还有一个用于发送样本的渲染线程 现在,我有很多死锁,它们挂在不同的地方,CPU非常高。 死锁通常发生在调整窗口大小时。 例如:当我调用下面的函数时,有时它会占用40秒,有时它只是挂在函数内部 Void GetVMR9VideoRender()
Void GetVMR9VideoRender()
{
hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC,
IID_IBaseFilter, (LPVOID *)&pRender.p);
if (FAILED(hr))
{
return NULL;
}
CComPtr <IVMRFilterConfig9> pConfig;
hr =pRender->QueryInterface(IID_IVMRFilterConfig9, (void**)&pConfig);
if (FAILED(hr))
return NULL;
pConfig->SetRenderingMode(VMRMode_Windowless);
pConfig->SetNumberOfStreams(1);
CComPtr<IVMRWindowlessControl9> lpDefWC;
hr = pRender->QueryInterface(IID_IVMRWindowlessControl9, (LPVOID*)&lpDefWC.p);
if (FAILED(hr))
{
return NULL;
}
m_lpDefWC = (IVMRWindowlessControl*)lpDefWC.p ;
CComPtr<IVMRAspectRatioControl9> lpARC;
hr = pRender->QueryInterface(IID_IVMRWindowlessControl9, (LPVOID*)&lpARC.p);
if (FAILED(hr))
{
return NULL;
}
m_lpARC = (IVMRAspectRatioControl*)lpARC.p ;
return pRender;
}
代码片段与死锁无关。一旦它锁定死锁,您需要使用调试器进入并检查堆栈,以确定死锁发生的确切位置。您使用什么源过滤器?您是否将自己的自定义筛选器添加到filtergraph?我在filtergraph中有两个筛选器,源筛选器由我自己定义,并从CBaseFilter继承。另一个是渲染过滤器。而我打印的时间,最消耗时间的句子是SetRenderingMode函数。