IMediaControl.Run()成功,相机预览仍为黑色

时间:2017-08-30 14:48:57

标签: directshow directshow.net

通过使用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
}

日志中仍然没有任何内容,即使我在该特定计算机上调试该应用程序,但程序执行成功。 所以问题是,为了避免此类问题,我如何确保实际启动相机预览?有没有办法检查流是否被阻止。

3 个答案:

答案 0 :(得分:2)

黑色相机预览不一定是无法运行图表的症状。例如,无论这是否是您的问题,过滤器图表尤其如此。显示IP摄像机馈送可以进入运行状态,并且视频渲染器将期望帧被分别接收和处理到它准备好的状态。但是,如果防病毒或防火墙阻止流量,则视频帧永远不会到达渲染器。过滤器图表正在运行,没有出现故障或错误。

您通常希望从过滤器图表中的过滤器请求一些统计信息,以证明存在有效负载处理。这可能包括:

  • 来自源过滤器的实际生成数据的查询
  • 能够提供处理数据统计的解码器等中间组件
  • 管道中的Sample Grabber过滤器,带有无需修改的回调计数样本
  • 来自视频渲染器的统计信息请求(例如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)中找到。