首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DSPack、Citrix和SetSyncSource()

DSPack、Citrix和SetSyncSource()
EN

Stack Overflow用户
提问于 2017-09-26 16:26:27
回答 1查看 326关注 0票数 1

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

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

代码语言:javascript
复制
  // 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消息来源的评论:

代码语言:javascript
复制
{ 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,Clément

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-12 14:16:21

引用IMediaFilter::SetSyncSource上的MSDN页面

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

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

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

我打赌,将参考时钟设置为NULL将解决这个问题。要做到这一点,您必须从IFilterGraph查询IFilterGraph接口并调用SetSyncSource(NULL)。这将禁用图形的整个计时,并以生成的速度呈现每个多媒体示例。

有关活动源代码筛选图的更多详细信息,请参见此MSDN页- https://msdn.microsoft.com/en-us/library/windows/desktop/dd390645(v=vs.85).aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46431524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档