DSPack,Citrix和SetSyncSource()

问题描述:

我使用Delphi XE和DSPack 2.3.3。 我正在维护一个带摄像头捕获的桌面应用程序。用户能够捕捉访客和文件的图片。 一切工作正常。我们最大的客户之一是转向Citrix 7.13,网络摄像机处于冻结状态。DSPack,Citrix和SetSyncSource()

他们的支持联系思杰和Citrix工程想知道如果应用程序调用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, 克莱门特

+0

我仍然有问题。我建立了一个绝对最小组件的小项目来开始视频捕捉。无论我做什么,都会调用SetSyncSource。例如,我认为在TPanel中制作视频显示(而不是正确的大小形式)可能会触发SetSyncSource。我让相机全屏显示,或者在浮动窗口中,它仍然会触发SetSyncSource。我删除了SampleGrabber,仍然触发。 “Niled”一些参数,仍然触发。 我不需要音频。只有低分辨率的视频。 –

引述MSDN页面上IMediaFilter::SetSyncSource

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

这意味着无论您的代码如何,都会调用SetSyncSource()。如果您使用的过滤器由于过滤器图形称为SetSyncSource()方法而失速,那么这看起来像是过滤器中的缺陷。

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

我敢打赌,将参考时钟设置为NULL将解决问题。为此,您必须从IFilterGraph查询IMediaFilter接口并致电SetSyncSource(NULL)。这将禁用图形的整个时间,并以与生成时相同的速度渲染每个多媒体样本。活源过滤图

更多细节可以在这个MSDN页面找到 - https://msdn.microsoft.com/en-us/library/windows/desktop/dd390645(v=vs.85).aspx

+0

就是这样。感谢您帮助安东! –