CSourceSeeking 類別

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

csourceseeking 類別階層

CSourceSeeking類別是抽象類別,用於實作使用一個輸出針腳在來源篩選中搜尋。

這個類別支援 IMediaSeeking 介面。 它會為所有 IMediaSeeking 方法提供預設實作。 受保護的成員變數會儲存開始時間、停止時間和目前速率。 根據預設,類別所支援的唯一時間格式 是TIME_FORMAT_MEDIA_TIME (100 奈秒單位) 。 如需詳細資訊,請參閱「備註」。

受保護的成員變數 Description
m_rtDuration 資料流程的持續時間。
m_rtStart 開始時間。
m_rtStop 停止時間。
m_dRateSeeking 播放速率。
m_dwSeekingCaps 搜尋功能。
m_pLock 要鎖定的重要區段物件的指標。
保護方法 Description
CSourceSeeking 建構函式方法。
純虛擬方法 Description
ChangeRate 播放速率變更時呼叫。
ChangeStart 開始位置變更時呼叫。
ChangeStop 停止位置變更時呼叫。
IMediaSeeking 方法 Description
IsFormatSupported 判斷是否支援指定的時間格式。
QueryPreferredFormat 擷取物件的慣用時間格式。
SetTimeFormat 設定時間格式。
IsUsingTimeFormat 判斷指定的時間格式是否為目前使用的格式。
GetTimeFormat 擷取目前的時間格式。
GetDuration 擷取資料流程的持續時間。
GetStopPosition 擷取播放相對於資料流程持續時間停止的時間。
GetCurrentPosition 擷取相對於資料流程總持續時間的目前位置。
GetCapabilities 擷取資料流程的所有搜尋功能。
CheckCapabilities 查詢資料流程是否有指定的搜尋功能。
ConvertTimeFormat 從某個時間格式轉換成另一個。
SetPositions 設定目前位置和停止位置。
GetPositions 擷取目前位置和停止位置。
GetAvailable 擷取搜尋有效率的時間範圍。
SetRate 設定播放速率。
GetRate 擷取播放速率。
GetPreroll 擷取預先註冊時間。

備註

每當開始位置、停止位置或播放速率變更時, CSourceSeeking 物件會呼叫對應的純虛擬方法:

衍生類別必須實作這些方法。 在任何搜尋作業之後,篩選準則必須執行下列動作:

  1. 在下游輸入針腳上呼叫 IPin::BeginFlush 方法。
  2. 停止正在傳遞資料的背景工作執行緒。
  3. 在輸入針腳上呼叫 IPin::EndFlush 方法。
  4. 重新開機背景工作執行緒。
  5. 在輸入釘選上呼叫 IPin::NewSegment 方法。
  6. 在第一個範例上設定不連續屬性。 呼叫 IMediaSample::SetDiscontinuity 方法。

如果執行緒遭到封鎖, BeginFlush 的呼叫會釋放背景工作執行緒,以等候傳遞範例。

在步驟 2 中,請確定執行緒已停止傳送資料。 視實作而定,您可能需要等候執行緒結束,或讓執行緒發出某種回應的訊號。 如果您的篩選準則使用 CSourceStream 類別, CSourceStream::Stop 方法會封鎖,直到背景工作執行緒回復為止。

在理想情況下,應該從背景工作執行緒傳遞新區段 (步驟 5) 。 只要篩選準則使用範例序列化它, CSourceSeeking 物件也可以完成此動作。

下列範例示範可能的實作。 它假設來源篩選的輸出針腳衍生自 CSourceSeekingCSourceStream。 此範例會定義執行步驟 1 4 的 Helper 方法 UpdateFromSeek。 CSourceStream::OnThreadStartPlay方法會覆寫以傳送新的區段,並設定指出不連續的旗標。 背景工作執行緒會挑選此旗標,並呼叫 IMediaSample::SetDiscontinuity 方法:

void CMyStream::UpdateFromSeek()
{
    if (ThreadExists()) 
    {
        DeliverBeginFlush();
        Stop();
        DeliverEndFlush();
        Run();
    }
}

HRESULT CMyStream::OnThreadStartPlay()
{
    m_bDiscontinuity = TRUE;
    return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}

支援其他時間格式

根據預設,這個類別僅支援以參考時間單位 (TIME_FORMAT_MEDIA_TIME) 搜尋。 若要支援其他時間格式,請覆寫處理時間格式的 IMediaSeeking 方法:

此外,請覆寫其餘 的 IMediaSeeking 方法,以在時間格式之間執行必要的轉換。 呼叫 SetTimeFormat 方法之後,所有 IMediaSeeking 方法都必須將傳入和傳出時間參數視為新時間格式。 例如,如果 m_rtDuration 變數以參考時間單位表示持續時間,但目前的時間格式是框架, 則 GetDuration 方法必須傳回值 m_rtDuration 轉換成框架。 例如:

STDMETHODIMP GetDuration(LONGLONG *pDuration)
{
    HRESULT hr = CSourceSeeking::GetDuration(pDuration);
    if (SUCCEEDED(hr))
    {
        if (m_TimeFormat == TIME_FORMAT_FRAME)
        {
            // Convert from reference time to frames.
            *pDuration = TimeToFrame(*pDuration);  // Private method.
        }
    }
    return hr
} 

此外,請務必檢查 IMediaSeeking::SetPositions 方法中的AM_SEEKING_ReturnTime旗標。 如果存在此旗標,當您將位置值傳回給呼叫端時,請將位置值轉換成參考時間。

規格需求

需求
標頭
Ctlutil.h (包含 Streams.h)
程式庫
Strmbase.lib (零售組建) ;
Strmbasd.lib (偵錯組建)

另請參閱

支援在來源篩選中搜尋