共用方式為


CBaseStreamControl.CheckStreamState 方法

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

方法 CheckStreamState 會判斷媒體範例是否應該傳遞或捨棄。

語法

enum CheckStreamState(
   IMediaSample *pSample
);

參數

pSample

範例 IMediaSample 介面的指標。

傳回值

傳回下列其中一個值。

傳回碼 Description
STREAM_DISCARDING
捨棄此範例。
STREAM_FLOWING
傳遞此範例。

備註

當您的針腳收到範例時,請呼叫此方法。 只有在傳回值STREAM_FLOWING時,才傳遞範例。 如果傳回值STREAM_DISCARDING,請捨棄範例。

如果針腳捨棄任何樣本,它應該藉由呼叫 IMediaSample::SetDiscontinuity 方法,將它傳遞的下一個樣本標示為不連續。

如果您的篩選實作 IAMDroppedFrames 介面來計算其卸載的畫面數,請勿將捨棄的框架計算為已捨棄的框架。

當傳回值STREAM_DISCARDING時,方法會封鎖直到參考時間到達樣本的開始時間為止。 這可防止您的針腳太快捨棄樣本。 如果篩選已暫停,則等候時間是無限的,直到篩選執行、停止或排清資料為止。 (篩選狀態變更和串流發生在不同的執行緒上,因此這不會造成任何死結。)

CBaseStreamControl::StreamControlState列舉的定義如下:

enum StreamControlState{ 
    STREAM_FLOWING = 0x1000,
    STREAM_DISCARDING
};

範例

下列範例假設針腳使用名為 m_fLastSampleDiscarded 的成員變數來追蹤不連續。

CMyPin::Receive(IMediaSample *pSample)
{
    if (!pSample) return E_POINTER;

    int iStreamState = CheckStreamState(pSample);
    if (iStreamState == STREAM_FLOWING) 
    {
        if (m_fLastSampleDiscarded)
            pSample->SetDiscontinuity(TRUE);
        m_fLastSampleDiscarded = FALSE;
        /* Deliver the sample. */
    } 
    else 
    {
        m_fLastSampleDiscarded = TRUE;  
       // Discard this sample. Do not deliver it.
    }
}

規格需求

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

另請參閱

CBaseStreamControl 類別