IMediaSeeking::SetPositions 方法 (strmif.h)

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

方法 SetPositions 會設定目前的位置和停止位置。

語法

HRESULT SetPositions(
  [in, out] LONGLONG *pCurrent,
  [in]      DWORD    dwCurrentFlags,
  [in, out] LONGLONG *pStop,
  [in]      DWORD    dwStopFlags
);

參數

[in, out] pCurrent

[in,out]指定目前時間格式單位之目前位置的變數指標。

[in] dwCurrentFlags

旗標的位組合。 請參閱<備註>。

[in, out] pStop

[in,out]指定停止時間的變數指標,以目前時間格式的單位為單位。

[in] dwStopFlags

旗標的位組合。 請參閱<備註>。

傳回值

傳回 HRESULT 值。 可能的值如下。

傳回碼 Description
S_FALSE
沒有位置變更。 (兩個旗標都未指定任何搜尋。)
S_OK
成功。
E_INVALIDARG
無效引數。
E_NOTIMPL
不支援方法。
E_POINTER
NULL 指標自變數。

備註

dwCurrentFlagsdwStopFlags 參數會定義搜尋的類型。 定義下列旗標。

定位旗標 Description
AM_SEEKING_NoPositioning 位置沒有變更。 (time 參數可以是 NULL.)
AM_SEEKING_AbsolutePositioning 指定的位置是絕對位置。
AM_SEEKING_RelativePositioning 指定的位置相對於先前的值。
AM_SEEKING_IncrementalPositioning pStop) 的停止位置 (相對於 pCurrent) 的目前 (位置。
 
修飾詞旗標 Description
AM_SEEKING_SeekToKeyFrame 搜尋最接近的主要畫面格。 這可能比較快,但較不精確。 DirectShow 隨附的篩選都不支援此旗標。 譯碼器是最可能支持的篩選類型。
AM_SEEKING_ReturnTime 傳回對等的參考時間。
AM_SEEKING_Segment 使用區段搜尋。
AM_SEEKING_NoFlush 請勿排清。
 

針對每個參數,請使用一個定位旗標。 選擇性地包含一或多個修飾詞旗標。

如果指定AM_SEEKING_ReturnTime旗標,方法會將位置值轉換成參考時間,並在 pCurrentpStop 變數中傳回它。 如果您使用另一個時間格式,例如畫面格,則此旗標很有用。

AM_SEEKING_Segment和AM_SEEKING_NoFlush旗標支援無縫迴圈:

  • 如果AM_SEEKING_Segment旗標存在,來源篩選會在到達停止位置時傳送 EC_END_OF_SEGMENT 事件,而不是呼叫 IPin::EndOfStream。 應用程式可以等候此事件,然後發出另一個 seek 命令。
  • 如果AM_SEEKING_NoFlush旗標存在,圖表不會在搜尋期間排清數據。 將此旗標與 AM_SEEKING_Segment搭配使用。
若要執行迴圈,圖形必須在 IMediaSeeking::GetCapabilities 方法中報告AM_SEEKING_CanDoSegments。 目前,只有 WAVE 剖析器篩選器 支援此功能。

pCurrentpStop 的傳入值會以目前時間格式表示。 默認時間格式REFERENCE_TIME單位 ( 100 奈秒) 。 若要變更時間格式,請使用 IMediaSeeking::SetTimeFormat 方法。 如果AM_SEEKING_ReturnTime旗標存在,方法會將傳出值轉換成 REFERENCE_TIME 單位。

篩選開發人員

如果您實作這個方法,您可以使用值AM_SEEKING_PositioningBitsMask遮罩修飾詞旗標,檢查呼叫端是否要求目前或停止位置的變更。 例如:
DWORD dwCurrentPos = dwCurrentFlags & AM_SEEKING_PositioningBitsMask
if (dwCurrentPos == AM_SEEKING_AbsolutePositioning)
{ 
    // Set new position to pCurrent.
    m_rtStart = *pCurrent;
}
else if (dwCurrentPos == AM_SEEKING_RelativePositioning)
{
    // Increment current position by pCurrent.
    m_rtStart += *pCurrent;
}
如需詳細資訊,請參閱基類庫中 CSourceSeeking::SetPositions 方法的原始程式碼。

規格需求

需求
最低支援的用戶端 Windows 2000 專業版 [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限傳統型應用程式]
目標平台 Windows
標頭 strmif.h (包含 Dshow.h)
程式庫 Strmiids.lib

另請參閱

錯誤和成功碼

IMediaSeeking 介面