時間戳
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
時間戳 定義媒體範例的開始和完成時間,以串流時間測量。 時間戳有時稱為 簡報時間。 閱讀本文的其餘部分時,請務必記住,並非所有格式都以相同的方式使用時間戳。 例如,並非所有的 MPEG 範例都會加上時間戳。 在 MPEG 篩選圖表中,時間戳不會套用至每個畫面,直到它們從譯碼器輸出為止。
當轉譯器篩選收到範例時,它會根據時間戳排程轉譯。 如果樣本遲到或沒有時間戳,篩選會立即轉譯範例。 否則,篩選條件會等到樣本開始時間才會轉譯樣本。 (呼叫 IReferenceClock::AdviseTime 方法,以等候開始時間。
來源篩選和剖析器篩選器負責在所處理的範例上設定正確的時間戳。 使用下列指導方針。
- 檔案播放:第一個範例是以零開始時間加上時間戳。 後續時間戳是由範例長度和播放速率所決定,其本身是由檔格式所決定。 剖析檔案的篩選條件負責計算正確的時間戳(例如,AVI 分隔器)。
- 視訊和音訊擷取:每個範例都會加上時間戳,其開始時間等於擷取的串流時間,並注意下列注意事項:
- 預覽釘選的視訊畫面(而不是擷取釘選)不會加上時間戳。 由於圖形延遲,使用擷取時間加上戳記的視訊畫面一律會遲到視訊轉譯器。 這可能會導致轉譯器在嘗試品質控制時卸除畫面格。 如需品質控制的相關信息,請參閱 Quality-Control Management。
- 音訊擷取:音訊擷取篩選器會使用自己的一組緩衝區,這與音訊驅動程式所使用的緩衝區不同。 音訊驅動程式會以固定間隔填滿擷取篩選器的緩衝區。 間隔取決於驅動程式,但通常不超過 10 毫秒。 音訊範例上的時間戳會反映驅動程式填入音訊擷取篩選器緩衝區的時間。 這些時間可能會稍微不準確,特別是當應用程式使用非常小的緩衝區大小時。 不過,媒體時間會準確地反映緩衝區中的音訊樣本數目。
- 多任務篩選器:視輸出格式而定,多任務篩選器可能需要產生時間戳,或可能不會產生時間戳。 例如,AVI 檔案格式使用沒有時間戳的固定幀速率,因此 AVI Mux 篩選器會假設樣本大約在正確的時間到達。 不過,如果傳入的時間戳顯示大於一個框架的間距,AVI Mux 會寫入大小為零的索引專案,以指出已卸載的框架。 在檔案播放時,會在運行時間產生新的時間戳,如先前所述。
若要在範例上設定時間戳,請呼叫 IMediaSample::SetTime 方法。
媒體時報
或者,篩選也可以為範例指定 媒體時間。 在視訊串流中,媒體時間代表畫面編號。 在音訊數據流中,媒體時間代表封包中的範例號碼。 例如,如果每個封包包含 44.1 kbhertz (kHz) 音訊的一秒,則第一個封包的媒體開始時間為零,而媒體停止時間為 44100。 在可搜尋的數據流中,媒體時間一律相對於數據流的開始時間。 例如,假設您從 15-fps 視訊串流開始到 2 秒。 搜尋之後的第一個媒體範例具有時間戳為零,但媒體時間為 30。
轉譯器和多任務篩選器可以使用媒體時間,藉由檢查間距來判斷畫面或樣本是否已卸除。 不過,設定媒體時間不需要篩選條件。 若要在範例上設定媒體時間,請呼叫 IMediaSample::SetMediaTime 方法。
相關主題
-
DirectShow 中的 時間和時鐘