CBaseStreamControl.CheckStreamState 方法
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
方法 CheckStreamState
會判斷媒體範例是否應該傳遞或捨棄。
語法
enum CheckStreamState(
IMediaSample *pSample
);
參數
-
pSample
-
範例 IMediaSample 介面的指標。
傳回值
傳回下列其中一個值。
傳回碼 | Description |
---|---|
|
捨棄此範例。 |
|
傳遞此範例。 |
備註
當您的針腳收到範例時,請呼叫此方法。 只有在傳回值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.
}
}
規格需求
需求 | 值 |
---|---|
標頭 |
|
程式庫 |
|