1

我使用 Delphi XE 和 DSPack 2.3.3。我正在使用网络摄像头捕获维护桌面应用程序。用户能够捕捉访问者和文档的图片。一切正常。我们最大的客户之一正在迁移到 Citrix 7.13,而网络摄像头正在冻结。

他们的支持联系了 Citrix,Citrix Engineering 想知道应用程序是否正在调用 IMediaFilter::SetSyncSource 方法,以在他们的代码中将“参考时钟”显式设置为过滤器图,以获取网络摄像头捕获。我做了一些测试,实际上渲染开始时有一个调用。运行 DSPack 演示“VideoCap”时可以看到调用:

  // now render streams
  with CaptureGraph as IcaptureGraphBuilder2 do
  begin
    // set the output filename
    SetOutputFileName(MEDIASUBTYPE_Avi, PWideChar(CapFile), multiplexer, Writer);

    // Connect Video preview (VideoWindow)
    if VideoSourceFilter.BaseFilter.DataLength > 0 then
      RenderStream(@PIN_CATEGORY_PREVIEW, nil, VideoSourceFilter as IBaseFilter,
        nil , VideoWindow as IBaseFilter);

    // Connect Video capture streams
    if VideoSourceFilter.FilterGraph <> nil then
      RenderStream(@PIN_CATEGORY_CAPTURE, nil, VideoSourceFilter as IBaseFilter,
        nil, multiplexer as IBaseFilter);

    // Connect Audio capture streams
    if AudioSourceFilter.FilterGraph <> nil then
    begin

      RenderStream(nil, nil, AudioSourceFilter as IBaseFilter,
        nil, multiplexer as IBaseFilter);
    end;
  end;
  CaptureGraph.Play; 

根据 DSpack 源评论:

{ The reference clock has changed. The filter graph manager sends this event
  when its IMediaFilter.SetSyncSource method is called.}
property OnGraphClockChanged: TNotifyEvent read FOnGraphClockChanged write FOnGraphClockChanged;

事实上 OnGraphClockChanged 在 CaptureGraph.Play 被调用后被触发。

是否可以避免调用 SetSyncSource?你知道这是否能解决这个问题?

TIA,克莱门特

4

1 回答 1

1

引用 MSDN 页面IMediaFilter::SetSyncSource

当图形运行时,Filter Graph 管理器在图形中的每个过滤器上调用此方法,以通知它们图形参考时钟。使用此方法存储 IReferenceClock 指针。增加存储指针的引用计数。在从图形中删除过滤器之前,过滤器图形管理器再次调用 SetSyncSource,其值为 NULL。

这意味着SetSyncSource()无论您的代码如何,都会调用它。如果您正在使用的过滤器由于过滤器图调用它的SetSyncSource()方法而停止,那么这似乎是过滤器中的缺陷。

在这种情况下,一个潜在的解决方法是围绕有问题的捕获过滤器创建一个包装过滤器,并转发所有方法调用,除了SetSyncSource(). 但很可能问题有其他根源。

我敢打赌,将参考时钟设置为NULL将解决问题。为此,您必须从中查询IMediaFilter接口IFilterGraph并调用SetSyncSource(NULL). 这将禁用图形的整个时序,并尽可能快地渲染每个多媒体样本。

有关实时源过滤器图的更多详细信息,请访问此 MSDN 页面 - https://msdn.microsoft.com/en-us/library/windows/desktop/dd390645(v=vs.85).aspx

于 2017-10-12T14:16:21.557 回答