共用方式為


設定和擷取位置

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

篩選圖表會維護兩個位置值:目前的位置和停止位置。 這些定義如下:

  • 當圖表運行時,當前位置是相對於來源開始的目前播放位置。 當圖形停止或暫停時,目前的位置是下一個執行命令上串流開始的點。
  • 停止位置是流結束的點。 當圖形到達停止位置時,不再繼續串流傳送任何數據,且過濾圖形管理器會發出 EC_COMPLETE 事件。 不過,圖表不會自動切換到已停止的狀態。如需詳細資訊,請參閱 回應事件。)

若要擷取這些值,請呼叫 IMediaSeeking::GetPositions 方法。 傳回的值一律與原始媒體來源相對。 根據預設,這些值會以參考時間單位為單位。 在某些情況下,您可以變更時間單位;如需詳細資訊,請參閱 搜尋命令的時間格式

若要搜尋新的位置或設定新的停止位置,請呼叫 IMediaSeeking::SetPositions 方法,如下列範例所示:

#define ONE_SECOND 10000000
REFERENCE_TIME rtNow  = 2 * ONE_SECOND, 
               rtStop = 5 * ONE_SECOND;

hr = pSeek->SetPositions(
    &rtNow,  AM_SEEKING_AbsolutePositioning, 
    &rtStop, AM_SEEKING_AbsolutePositioning
    );

注意

一秒是 10,000,000 個參考時間單位。 為了方便起見,此範例會將此值定義為ONE_SECOND。 如果您使用 DirectShow 基類連結庫,常數 UNITS 的值相同。

 

rtNow 參數會指定新的目前位置。 第二個參數是旗標,用於定義如何解譯 rtNow。 在此範例中,AM_SEEKING_AbsolutePositioning旗標表示 rtNow 指定來源中的絕對位置。 因此,濾鏡圖形會定位到數據流開始後的兩秒位置。 rtStop 參數會提供停止時間。 最後一個參數指定 rtStop 也是絕對位置。

若要指定相對於上一個位置值的位置,請使用 AM_SEEKING_RelativePositioning 旗標。 若要讓其中一個位置值保持不變,請使用 AM_SEEKING_NoPositioning 旗標。 對應的時間參數在此情況下可以為 NULL。 下列範例會向前搜尋 10 秒,但讓停止位置保持不變:

REFERENCE_TIME rtNow = 10 * ONE_SECOND;
hr = pSeek->SetPositions(
    &rtNow, AM_SEEKING_RelativePositioning, 
    NULL, AM_SEEKING_NoPositioning
    );

如果篩選圖形已停止,影片轉譯器就不會在搜尋作業之後更新影像。 對用戶來說,它看起來就像搜尋未發生一樣。 若要更新影像,請在搜尋作業之後暫停圖形。 暫停圖形會提示視訊轉譯器的新視訊畫面。 您可以使用 IMediaControl::StopWhenReady 方法來暫停圖形,然後停止圖形。