CSourceSeeking 類別
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
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 物件會呼叫對應的純虛擬方法:
- 開始位置: CSourceSeeking::ChangeStart
- 停止位置: CSourceSeeking::ChangeStop
- 播放速率: CSourceSeeking::ChangeRate
衍生類別必須實作這些方法。 在任何搜尋作業之後,篩選準則必須執行下列動作:
- 在下游輸入針腳上呼叫 IPin::BeginFlush 方法。
- 停止正在傳遞資料的背景工作執行緒。
- 在輸入針腳上呼叫 IPin::EndFlush 方法。
- 重新開機背景工作執行緒。
- 在輸入釘選上呼叫 IPin::NewSegment 方法。
- 在第一個範例上設定不連續屬性。 呼叫 IMediaSample::SetDiscontinuity 方法。
如果執行緒遭到封鎖, BeginFlush 的呼叫會釋放背景工作執行緒,以等候傳遞範例。
在步驟 2 中,請確定執行緒已停止傳送資料。 視實作而定,您可能需要等候執行緒結束,或讓執行緒發出某種回應的訊號。 如果您的篩選準則使用 CSourceStream 類別, CSourceStream::Stop 方法會封鎖,直到背景工作執行緒回復為止。
在理想情況下,應該從背景工作執行緒傳遞新區段 (步驟 5) 。 只要篩選準則使用範例序列化它, CSourceSeeking 物件也可以完成此動作。
下列範例示範可能的實作。 它假設來源篩選的輸出針腳衍生自 CSourceSeeking 和 CSourceStream。 此範例會定義執行步驟 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::GetTimeFormat
- IMediaSeeking::GetTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::IsUsingTimeFormat
- IMediaSeeking::SetTimeFormat
此外,請覆寫其餘 的 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旗標。 如果存在此旗標,當您將位置值傳回給呼叫端時,請將位置值轉換成參考時間。
規格需求
需求 | 值 |
---|---|
標頭 |
|
程式庫 |
|