Delphi DSPack、Citrix和SetSyncSource()
我使用delphixe和dspack2.3.3。 我正在维护一个带有网络摄像头捕获的桌面应用程序。用户能够捕获访客和文档的图片。 一切正常。我们最大的客户之一正在迁移到Citrix 7.13,而网络摄像头正在冻结 他们的支持人员联系了Citrix,Citrix工程部想知道应用程序是否正在调用IMediaFilter::SetSyncSource方法,以便在他们的代码中明确设置有关网络摄像头捕获的过滤器图的“参考时钟”。 我做了一些测试,事实上在渲染开始时有一个调用。运行DSPack demo VideoCap时可以看到调用:Delphi DSPack、Citrix和SetSyncSource(),delphi,directshow,citrix,dspack,Delphi,Directshow,Citrix,Dspack,我使用delphixe和dspack2.3.3。 我正在维护一个带有网络摄像头捕获的桌面应用程序。用户能够捕获访客和文档的图片。 一切正常。我们最大的客户之一正在迁移到Citrix 7.13,而网络摄像头正在冻结 他们的支持人员联系了Citrix,Citrix工程部想知道应用程序是否正在调用IMediaFilter::SetSyncSource方法,以便在他们的代码中明确设置有关网络摄像头捕获的过滤器图的“参考时钟”。 我做了一些测试,事实上在渲染开始时有一个调用。运行DSPack demo V
// 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;
事实上,在CaptureGraph.Play被调用后,OnGraphClockChanged会被解雇
是否可以避免调用SetSyncSource?
你知道这能否解决这个问题吗
蒂亚,
Clément引用IMediaFilter::SetSyncSource上的MSDN页面:
当图形运行时,过滤器图形管理器对图形中的每个过滤器调用此方法,以通知它们图形参考时钟。使用此方法存储IReferenceLock指针。递增存储指针上的引用计数。在从图中删除过滤器之前,过滤器图管理器再次调用SetSyncSource,其值为NULL
这意味着不管您的代码如何,都会调用SetSyncSource。如果您正在使用的过滤器由于过滤器图调用其SetSyncSource方法而暂停,那么这似乎是过滤器中的一个缺陷
在这种情况下,一个潜在的解决方法是围绕所讨论的捕获过滤器创建一个包装过滤器,并转发除SetSyncSource之外的所有方法调用。但这个问题很可能有其他原因
我敢打赌,将参考时钟设置为空将解决问题。为此,您必须从IFilterGraph查询IMediaFilter接口并调用SetSyncSourceNULL。这将禁用图形的整个计时,并以生成的速度渲染每个多媒体样本
有关实时源代码筛选器图表的更多详细信息,请访问此MSDN页面-我仍然有问题。我建立了一个小项目,用绝对最小的组件开始视频捕获。无论我做什么,都会调用SetSyncSource。例如,我认为以TPanel而不是正确大小的形式显示视频可能会触发SetSyncSource。我让相机全屏显示,或者在浮动窗口中显示,它仍然会触发SetSyncSource。我移除了样本采集装置,仍然触发。某些参数为零,仍为触发器。我不需要音频。只有低分辨率的视频,就是这样。谢谢你帮助安东!
{ 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;