參考時鐘
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
Filter Graph Manager 的其中一個函式是將圖形中的所有篩選同步處理至相同的時鐘,稱為 參考時鐘。
公開 IReferenceClock 介面的任何物件都可以做為參考時鐘。 參考時鐘可能由 DirectShow 篩選器提供,通常是可存取硬體定時器的音訊轉譯器。 作為後援,Filter Graph 管理員可以使用系統時間。
從名義上說,參考時鐘會以 100 奈秒間隔測量時間,不過時鐘的實際精確度可能較少。 若要擷取時鐘的目前時間,請呼叫 IReferenceClock::GetTime 方法。 時鐘的基準—開始計算的時間—取決於實作,因此 getTime 所傳回的值原本就沒有意義。 重要的是圖表開始執行時的差異。
雖然參考時鐘的精確度可能會有所不同,但 GetTime 方法所傳回的時間保證會單調增加。 換句話說,時鐘時間永遠不會倒退。 如果參考時鐘是從硬體來源產生時鐘時間,而硬體時鐘會向後跳躍(例如,如果時鐘有調整),GetTime 方法應該會繼續傳回上次報告的時間,直到硬體時鐘趕上為止。 如需詳細資訊,請參閱 CBaseReferenceClock 類別。
默認參考時鐘
篩選圖形管理員會在圖表執行時自動選取參考時鐘。 它會使用下列演算法來選取時鐘:
- 如果應用程式已選取時鐘(請參閱下方),請使用該時鐘。
- 如果圖表包含支援 IReferenceClock的即時來源篩選,請使用該篩選。 如需即時來源的定義,請參閱 Live Sources。
- 如果圖表未包含任何即時來源篩選,請在支援 IReferenceClock的圖形中使用任何篩選,從轉譯器和工作上游開始。 偏好使用連線的篩選,而不是未連接的篩選條件。 (如果圖表正在轉譯音訊數據流,演算法中的此步驟通常會選取音訊轉譯器篩選。
- 如果沒有篩選條件提供適當的時鐘,請使用以系統時間為基礎的 系統參考時鐘。
設定參考時鐘
應用程式可以在 Filter Graph Manager 上呼叫 IMediaFilter::SetSyncSource 方法來選取時鐘。 只有當您有特定理由想要另一個時鐘時,才應該這麼做。
您可以指示 Filter Graph 管理員不要使用參考時鐘,方法是呼叫 SetSyncSource,並將值 NULL。 例如,您可以執行此動作,以儘快處理範例。 若要還原預設參考時鐘,請在 Filter Graph 管理員上呼叫 IFilterGraph::SetDefaultSyncSource 方法。
每當參考時鐘變更時,Filter Graph 管理員會呼叫其 IMediaFilter::SetSyncSource 方法來通知每個篩選。 應用程式不應該在篩選上呼叫此方法。
相關主題