共用方式為


設定和擷取位置

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

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

  • 當圖表執行時,目前位置是相對於來源開頭的目前播放位置。 當圖形停止或暫停時,目前的位置就是下一個執行命令上串流開始的點。
  • 停止位置是資料流程結束的點。 當圖表到達停止位置時,不會再串流處理任何資料,而且篩選圖表管理員會張貼 EC_COMPLETE 事件。 不過, (圖形不會自動切換到停止狀態。如需詳細資訊,請參閱 回應 Events.)

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

若要尋找新的位置或設定新的停止位置,請呼叫 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 方法,此方法會暫停圖形,然後停止圖形。