串流結束通知
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
當來源篩選完成傳送資料時,它會在下游輸入針腳上呼叫 IPin::EndOfStream 方法。 下游篩選準則會將呼叫傳播至下一個篩選準則,依此類置。 當 EndOfStream 呼叫到達轉譯器時,轉譯器會將 EC_COMPLETE 事件傳送至 Filter Graph 管理員。 如果轉譯器有多個輸入針腳,則會在每個輸入釘選收到串流結束通知之後傳遞EC_COMPLETE事件。
篩選準則必須以其他串流呼叫序列化 EndOfStream 呼叫,例如 IMemInputPin::Receive。 (換句話說,下游篩選必須一律以正確的順序接收呼叫。)
在某些情況下,下游篩選準則可能會在來源篩選之前偵測到資料流程結尾。 (例如,下游篩選可能會剖析 stream.) 在此情況下,下游篩選可以傳送串流結束通知,在此情況下,它應該從 IMemInputPin::Receive 傳回S_FALSE,直到圖形停止或排清為止。 S_FALSE傳回值會通知來源篩選準則停止傳送資料。
預設處理EC_COMPLETE
根據預設,Filter Graph 管理員不會將每個EC_COMPLETE事件轉送至應用程式。 相反地,它會等到所有資料流程發出訊號EC_COMPLETE,然後傳送單一EC_COMPLETE事件。 因此,應用程式會在每個資料流程完成之後接收事件。
若要判斷資料流程數目,篩選圖形管理員會計算支援透過 IMediaSeeking 或 IMediaPosition) 搜尋 (的篩選數目,並具有 轉譯的 輸入釘選,其定義為沒有對應輸出的輸入針腳。 Filter Graph 管理員會判斷針腳是否以下列兩種方式之一轉譯:
- 針腳的 IPin::QueryInternalConnections 方法會在 nPin 參數中傳回零。
- 篩選準則會公開 IAMFilterMiscFlags 介面,並傳回AM_FILTER_MISC_FLAGS_IS_RENDERER旗標。
提取模式中的串流結束通知
在 IAsyncReader 連線中,來源篩選不會傳送串流結束通知。 Instread 是由下游篩選來完成,通常是剖析器篩選。 剖析器會傳送 EndOfStream 呼叫下游。 它不會將一個上游傳送至來源篩選。
相關主題