共用方式為


在擷取篩選中產生資料

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

本主題描述自訂 DirectShow 擷取篩選應該如何產生輸出資料。

篩選狀態變更

只有在篩選正在執行時,擷取篩選才會產生資料。 當篩選暫停時,請勿從您的釘選傳送資料。 此外,當篩選暫停時,從CBaseFilter::GetState方法傳回VFW_S_CANT_CUE。 這個傳回值會通知 Filter Graph 管理員,在篩選暫停時,不應該等候篩選中的任何資料。 如需詳細資訊,請參閱 篩選狀態

下列程式碼示範如何實 作 IMediaFilter::GetState 方法:

CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *pState)
{
    CheckPointer(pState, E_POINTER);
    *pState = m_State;
    if (m_State == State_Paused)
    {
        return VFW_S_CANT_CUE;
    }
    else
    {
        return S_OK;
    }
}

控制個別資料流程

擷取篩選器的輸出針腳應該支援 IAMStreamControl 介面,讓應用程式可以個別開啟或關閉每個針腳。 例如,應用程式可以在不擷取的情況下預覽,然後切換至擷取模式,而不需重建篩選圖形。 您可以使用 CBaseStreamControl 類別來實作此介面。

時間戳記

當篩選擷取範例時,會將範例時間戳記為目前的資料流程時間。 結束時間是開始時間加上持續時間。 例如,如果篩選每秒擷取 10 個樣本,而資料流程時間在擷取樣本時為 200,000,000 單位,則時間戳記應該是 20000000000000。 (每秒有 10,000,000 個單位。)

若要計算資料流程時間,請呼叫 IReferenceClock::GetTime 方法以取得目前的參考時間,然後子建立原始開始時間。 或者,呼叫執行相同計算的 CBaseFilter::StreamTime 方法。 若要在範例上設定時間戳記,請呼叫 IMediaSample::SetTime 方法。

不過,如果篩選有預覽釘選,則預覽釘選中的範例不應該有時間戳記。 原因是樣本一律會在擷取時間之後稍微到達轉譯器。 如果樣本經過時間戳記,轉譯器會將其視為晚期,而且可能會嘗試藉由卸載樣本來趕上。 (如需詳細資訊,請參閱 DirectShow 影片擷取篩選器.) 注意 IAMStreamControl 介面需要釘選才能追蹤取樣時間。 針對預覽釘選,您可能需要修改實作,使其不依賴時間戳記。

時間戳記必須一律從一個範例增加到下一個範例。 即使篩選暫停,也是如此。 如果篩選準則執行、暫停,然後再次執行,暫停之後的第一個範例必須具有比暫停前最後一個樣本更大的時間戳記。

視您擷取的資料而定,可能適合在範例上設定媒體時間。

如需詳細資訊,請參閱 DirectShow 中的時間和時鐘

DirectShow 影片擷取篩選

DirectShow 中的時間和時鐘

撰寫擷取篩選