時間戳記

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

時間戳記會定義以串流時間測量的媒體範例開始和完成時間。 時間戳記有時稱為 簡報時間。 閱讀本文的其餘部分時,請務必記住並非所有格式都以相同的方式使用時間戳。 例如,並非所有 MPEG 範例都會時間戳記。 在 MPEG 篩選圖表中,時間戳記不會套用至每個畫面,直到從解碼器輸出為止。

當轉譯器篩選收到範例時,它會根據時間戳記排程轉譯。 如果樣本遲到或沒有時間戳記,篩選會立即轉譯樣本。 否則,篩選準則會等到樣本開始時間才會轉譯樣本。 (它會藉由呼叫 IReferenceClock::AdviseTime 方法.) 等候開始時間

來源篩選和剖析器篩選準則負責在所處理的範例上設定正確的時間戳記。 使用下列指導方針。

  • 檔案播放:第一個範例是以零開始時間加上時間戳記。 後續的時間戳記是由樣本長度和播放速率所決定,其本身是由檔案格式決定。 剖析檔案的篩選準則負責計算正確的時間戳記 (例如 AVI 分割器) 。
  • 視訊和音訊擷取:每個範例的時間戳記都等於擷取的串流時間,並注意下列事項:
    • 預覽釘選 (的視訊畫面,而不是擷取釘選) 不會加時間戳記。 由於圖形延遲,以擷取時間加上戳記的視訊畫面一律會延遲抵達視訊轉譯器。 這可能會導致轉譯器在嘗試進行品質控制時卸載畫面格。 如需有關品質控制的資訊,請參閱 品質控制管理
    • 音訊擷取:音訊擷取篩選器會使用自己的一組緩衝區,與音訊驅動程式所使用的緩衝區分開。 音訊驅動程式會以固定間隔填滿擷取篩選器的緩衝區。 間隔取決於驅動程式,但通常不超過 10 毫秒。 音訊範例上的時間戳記會反映驅動程式填滿音訊擷取篩選器緩衝區的時間。 這些時間可能會稍微不正確,特別是當應用程式使用非常小的緩衝區大小時。 不過,媒體時間會精確地反映緩衝區中的音訊樣本數目。
  • 多工篩選器:視輸出格式而定,多工篩選器可能需要產生時間戳記,或可能不會產生時間戳記。 例如,AVI 檔案格式使用沒有時間戳記的固定畫面播放速率,因此 AVI Mux 篩選器會假設樣本接近正確的時間。 不過,如果傳入時間戳記顯示大於一個框架的間距,AVI Mux 會寫入大小為零的索引項目目,以表示已捨棄的框架。 在檔案播放時,新的時間戳記會在執行時間產生,如先前所述。

若要在範例上設定時間戳記,請呼叫 IMediaSample::SetTime 方法。

媒體時間

或者,篩選也可以指定範例的 媒體時間 。 在視訊串流中,媒體時間代表畫面編號。 在音訊資料流程中,媒體時間代表封包中的樣本號碼。 例如,如果每個封包包含 44.1 kbhertz (kHz) 音訊中的一秒,則第一個封包的媒體開始時間為零,而媒體停止時間為 44100。 在可搜尋的資料流程中,媒體時間一律相對於資料流程的開始時間。 例如,假設您從 15-fps 視訊串流開始到 2 秒。 搜尋之後的第一個媒體範例時間戳記為零,但媒體時間為 30。

轉譯器和多工篩選器可以使用媒體時間,藉由檢查間距來判斷畫面格或樣本是否已卸載。 不過,設定媒體時間不需要篩選準則。 若要在範例上設定媒體時間,請呼叫 IMediaSample::SetMediaTime 方法。

DirectShow 中的時間和時鐘