参考时钟

[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayerIMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]

Filter Graph 管理器的一个函数是将图形中的所有筛选器同步到同一时钟,称为 引用时钟

公开 IReferenceClock 接口的任何对象都可以充当引用时钟。 参考时钟可能由 DirectShow 筛选器提供,通常是音频呈现器,后者有权访问硬件计时器。 作为回退,Filter Graph 管理器可以使用系统时间。

从名义上说,参考时钟以 100 纳秒间隔测量时间,尽管时钟的实际准确度可能更少。 若要检索时钟的当前时间,请调用 IReferenceClock::GetTime 方法。 时钟的基线(从其开始计数的时间)取决于实现,因此 getTime 返回的值本质上没有意义。 关系图开始运行时的增量很重要。

尽管引用时钟的准确性可能会有所不同,但可以保证 getTime方法返回的时间单调增加。 换句话说,时钟时间永远不会向后。 如果引用时钟从硬件源生成时钟时间,并且硬件时钟向后跳跃(例如,如果时钟有调整),则 GetTime 方法应继续返回上次报告的时间,直到硬件时钟赶上为止。 有关详细信息,请参阅 CBaseReferenceClock 类

默认参考时钟

筛选器图形管理器在图形运行时自动选择引用时钟。 它使用以下算法来选择时钟:

  • 如果应用程序选择了时钟(请参阅下文),请使用该时钟。
  • 如果图形包含支持 IReferenceClock的实时源筛选器,请使用该筛选器。 有关实时源的定义,请参阅 实时源
  • 如果图形不包含任何实时源筛选器,请使用图形中支持 IReferenceClock的任何筛选器,从呈现器和工作上游开始。 首选连接筛选器而不是未连接的筛选器。 (如果图形正在呈现音频流,则算法中的此步骤通常会选择音频呈现器筛选器。
  • 如果没有筛选器提供合适的时钟,请使用 系统参考时钟,该时钟基于系统时间。

设置引用时钟

应用程序可以通过在 Filter Graph 管理器上调用 IMediaFilter::SetSyncSource 方法来选择时钟。 仅当有特定理由首选另一个时钟时,才应执行此作。

可以通过调用 SetSyncSource 的值 NULL来指示 Filter Graph 管理器不要使用引用时钟。 例如,可以执行此作以尽快处理示例。 若要还原默认引用时钟,请对 Filter Graph 管理器调用 IFilterGraph::SetDefaultSyncSource 方法。

每当引用时钟发生更改时,Filter Graph 管理器都会通过调用其 IMediaFilter::SetSyncSource 方法通知每个筛选器。 应用程序绝不应在筛选器上调用此方法。

设置图形时钟

DirectShow 中的 时间和时钟