通过使用Directshow.NET和c#,我开发了一个显示相机预览的应用程序。一年以来一切正常,但突然客户抱怨黑色相机预览。
经过一番挖掘后,我发现反病毒程序阻止我的应用程序使用相机。在反病毒程序的排除列表中添加我的应用程序后,应用程序就像以前一样工作。
在程序中,我已正确抛出HRESULT
的异常,如下所示:
try
{
//FilterGraph creation
//CaptureGraphBuilder2 creation
//AddSourceFilterForMoniker()
//SampleGrabber configuration
//VMR9 configuration
hr = mediaControl.Run();
DsError.ThrowExceptionForHR(hr);
}
catch(Exception ex)
{
//logging part
}
日志中仍然没有任何内容,即使我在该特定计算机上调试该应用程序,但程序执行成功。 所以问题是,为了避免此类问题,我如何确保实际启动相机预览?有没有办法检查流是否被阻止。
答案 0 :(得分:2)
黑色相机预览不一定是无法运行图表的症状。例如,无论这是否是您的问题,过滤器图表尤其如此。显示IP摄像机馈送可以进入运行状态,并且视频渲染器将期望帧被分别接收和处理到它准备好的状态。但是,如果防病毒或防火墙阻止流量,则视频帧永远不会到达渲染器。过滤器图表正在运行,没有出现故障或错误。
您通常希望从过滤器图表中的过滤器请求一些统计信息,以证明存在有效负载处理。这可能包括:
IQualProp::get_FramesDrawn
" ...检索自流式传输开始后实际绘制的帧数")随着时间的推移,当您看到正在处理数据时,您知道没有意外的锁定发生。
答案 1 :(得分:0)
您可以订阅活动MediaElementBase.NewAllocatorFrame
,您可以了解相机来源过滤器是否正常工作。
答案 2 :(得分:0)
我建议你在运行对象表中添加一个DirectShow过滤器图,允许GraphEdit进入"间谍"在远程过滤器图表上。 这有助于检查图形连接,过滤器状态,引脚属性以及纠正或优化它以便解决问题。
构建和/或开始捕获图之后,只需调用此方法,以便通过Graphedit应用程序进行图形和过滤状态。
///
/// \fn AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
///
HRESULT CCapture::AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
{
IMoniker * pMoniker;
IRunningObjectTable *pROT;
WCHAR wsz[128];
HRESULT hr;
ULONG ret = 0;
if (FAILED(GetRunningObjectTable(0, &pROT)))
return E_FAIL;
wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph,
GetCurrentProcessId());
hr = CreateItemMoniker(L"!", wsz, &pMoniker);
if (SUCCEEDED(hr)) {
hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
ret = pMoniker->Release();
}
pROT->Release();
return hr;
}
GraphEdit可在Microsoft Windows软件开发工具包(SDK)(http://go.microsoft.com/fwlink/p/?linkid=62332)中找到。