參考時鐘

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

Filter Graph 管理員的其中一個函式是將圖形中的所有篩選同步處理至相同的時鐘,稱為 參考時鐘

任何公開 IReferenceClock 介面的物件都可以做為參考時鐘。 參考時鐘可能是由 DirectShow 篩選準則提供,通常是音訊轉譯器,其可存取硬體計時器。 做為後援,篩選圖形管理員可以使用系統時間。

相對地,參考時鐘會以 100 奈秒間隔測量時間,雖然時鐘的實際精確度可能較少。 若要擷取時鐘的目前時間,請呼叫 IReferenceClock::GetTime 方法。 時鐘的基準—開始計算的時間,取決於實作,因此 GetTime 傳回的值原本就沒有意義。 從圖形開始執行時的差異很重要。

雖然參考時鐘的精確度可能會有所不同,但 GetTime 方法所傳回的時間保證會以單調方式增加。 換句話說,時鐘時間永遠不會向後移動。 例如,如果參考時鐘是從硬體來源產生時鐘時間,而硬體時鐘跳回 (例如,如果時鐘) 有調整, GetTime 方法應該會繼續傳回上次回報的時間,直到硬體時鐘趕上為止。 如需詳細資訊,請參閱 CBaseReferenceClock 類別

預設參考時鐘

篩選圖形管理員會在圖表執行時自動選取參考時鐘。 它會使用下列演算法來選取時鐘:

  • 如果應用程式已選取時鐘 (請參閱下列) ,請使用該時鐘。
  • 如果圖表包含支援 IReferenceClock的即時來源篩選,請使用該篩選準則。 如需即時來源的定義,請參閱 即時來源
  • 如果圖表不包含任何即時來源篩選,請使用支援 IReferenceClock的圖形中的任何篩選,從轉譯器和上游工作開始。 偏好使用連線的篩選,而非未連線的篩選。 (如果圖形正在轉譯音訊資料流程,演算法中的此步驟通常會選取音訊轉譯器篩選。)
  • 如果沒有篩選準則提供適當的時鐘,請使用 以系統時間為基礎的系統參考時鐘

設定參考時鐘

應用程式可以在篩選圖形管理員上呼叫 IMediaFilter::SetSyncSource 方法,以選取時鐘。 只有在有特定原因偏好另一個時鐘時,才應該這麼做。

您可以使用Null值呼叫SetSyncSource,指示 Filter Graph 管理員不要使用參考時鐘。 例如,您可以執行此動作以儘快處理範例。 若要還原預設參考時鐘,請在篩選圖形管理員上呼叫 IFilterGraph::SetDefaultSyncSource 方法。

每當參考時鐘變更時,Filter Graph 管理員會呼叫其 IMediaFilter::SetSyncSource 方法,以通知每個篩選。 應用程式不應該在篩選上呼叫這個方法。

設定圖形時鐘

DirectShow 中的時間和時鐘