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, 克莱门特
引述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
就是这样。感谢您帮助安东! –
我仍然有问题。我建立了一个绝对最小组件的小项目来开始视频捕捉。无论我做什么,都会调用SetSyncSource。例如,我认为在TPanel中制作视频显示(而不是正确的大小形式)可能会触发SetSyncSource。我让相机全屏显示,或者在浮动窗口中,它仍然会触发SetSyncSource。我删除了SampleGrabber,仍然触发。 “Niled”一些参数,仍然触发。 我不需要音频。只有低分辨率的视频。 –