参考时钟

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

Filter Graph 管理器的一个功能是将图形中的所有筛选器同步到同一时钟(称为 引用时钟)。

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

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

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

默认参考时钟

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

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

设置引用时钟

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

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

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

设置图形时钟

DirectShow 中的时间和时钟