我使用Delphi和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,Clément
发布于 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。
https://stackoverflow.com/questions/46431524
复制相似问题