共用方式為


接收和傳遞範例

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

下列虛擬程式碼示範如何實作 IMemInput::Receive 方法:

HRESULT CMyInputPin::Receive(IMediaSample *pSample)
{
    CAutoLock cObjectLock(&m_csReceive);

    // Perhaps the filter needs to wait on something.
    WaitForSingleObject(m_hSomeEventThatReceiveNeedsToWaitOn, INFINITE);

    // Before using resources, make sure it is safe to proceed. Do not
    // continue if the base-class method returns anything besides S_OK.
    hr = CBaseInputPin::Receive(pSample);
    if (hr != S_OK) 
    {
        return hr;
    }

    /* It is safe to use resources allocated in Active and Pause. */

    // Deliver sample(s), via your output pin(s).
    for (each output pin)
        pOutputPin->Deliver(pSample);

    return hr;
}

Receive方法會保存串流鎖定,而不是篩選鎖定。 篩選準則可能需要等候某些事件,才能處理資料,如 WaitForSingleObject呼叫所示。 並非所有篩選都需要這麼做。 CBaseInputPin::Receive方法會驗證一些一般串流條件。 如果篩選已停止,則會傳回VFW_E_WRONG_STATE,S_FALSE篩選已排清,依此類推。 S_OK以外的任何傳回碼都表示 Receive 方法應該立即傳回,而不是處理範例。

處理範例之後,呼叫 CBaseOutputPin::D eliver,將它傳遞給下游篩選。 這個協助程式方法會在下游輸入針腳上呼叫 IMemInputPin::Receive 。 篩選準則可能會將範例傳遞至數個針腳。