[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
類別 CBaseRenderer 是實作轉譯器篩選的基類。 它支援一個輸入針腳,由 CRendererInputPin 類別實作。 若要使用此類別,請宣告繼承 的 CBaseRenderer 衍生類別。 衍生類別至少必須實作下列方法,這些方法會在基類中宣告為純虛擬:
- CBaseRenderer::CheckMediaType:接受或拒絕建議的媒體類型。 篩選準則會在針腳連接程式期間呼叫這個方法。
- CBaseRenderer::D oRenderSample:轉譯範例。 篩選會針對執行時接收的每個範例呼叫這個方法。
基類會處理狀態變更和同步處理問題。 它也會排程範例進行轉譯,但不會實作任何品質控制措施。 基類也會宣告數個「處理常式」方法。 這些是篩選準則在串流進程中特定點呼叫的方法。 它們不會在基類中執行任何動作,但衍生類別可以覆寫它們。 在下清單格中,它們列在 [公用方法:處理常式] 標題之下。
CBaseRenderer::OnReceiveFirstSample處理常式值得特別提及。 如果篩選在篩選暫停時收到範例,則篩選準則會呼叫此方法。 如果圖形從停止切換為暫停,或是在暫停時搜尋圖表,就會發生這種情況。 視訊轉譯器通常會使用範例來顯示仍然的畫面。 當篩選從暫停切換為執行時,它會將相同的範例傳送至 CBaseRenderer::D oRenderSample 方法,作為資料流程中的第一個範例。
類別 CBaseRenderer 會透過CRendererPosPassThru物件公開IMediaSeeking和IMediaPosition介面。 它會將所有搜尋要求傳遞至下一個篩選上游。
排程
當上游篩選呼叫輸入針腳的 IMemInputPin::Receive 方法以傳遞範例時,針腳會將此呼叫傳遞至篩選的 CBaseRenderer::Receive 方法。 篩選準則會卸載樣本、立即轉譯,或排程它進行轉譯。
如果樣本沒有時間戳記,或者沒有可用的參考時鐘,篩選會立即轉譯樣本。 否則,篩選準則會呼叫 CBaseRenderer::ShouldDrawSampleNow 方法來判斷要執行的動作。 根據預設,此範例會根據其時間戳記進行排程。 衍生類別可以覆寫 ShouldDrawSampleNow 以支援品質控制。
若要排程範例,篩選準則會呼叫 IReferenceClock::AdviseTime 方法,以建立建議要求。 Receive方法接著會封鎖直到排程的時間,或直到篩選變更狀態為止。 封鎖可防止上游篩選準則傳遞更多樣本,直到目前的樣本轉譯為止。
當上游篩選呼叫 IPin::EndOfStream 方法以發出資料流程結尾的訊號時,篩選準則會將 EC_COMPLETE 事件傳送至篩選圖形管理員。 篩選準則會等候目前樣本的停止時間,再傳送事件。
| 受保護的成員變數 | Description |
|---|---|
| m_bAbort | 指出是否要停止轉譯並拒絕進一步樣本的旗標。 |
| m_bEOS | 指出是否已達到資料流程結束的旗標。 |
| m_bEOSDelivered | 旗標,指出篩選是否已張貼EC_COMPLETE事件。 |
| m_bInReceive | 指出篩選準則是否正在處理 接收 呼叫的旗標。 |
| m_bRepaintStatus | 啟用或停用重新繪製事件的旗標。 |
| m_bStreaming | 指出篩選是否正在串流資料的旗標。 |
| m_dwAdvise | 排程轉譯之計時器事件的識別碼。 |
| m_EndOfStreamTimer | 計時器事件識別碼,用於排程EC_COMPLETE通知。 |
| m_evComplete | 狀態轉換完成時發出訊號的事件。 |
| m_InterfaceLock | 篩選狀態鎖定。 |
| m_ObjectCreationLock | 鎖定以保護在篩選內建立物件。 |
| m_pInputPin | 篩選輸入針腳的指標。 |
| m_pMediaSample | 目前媒體範例的指標。 |
| m_pPosition | 協助程式物件,以傳遞上游的搜尋命令。 |
| m_pQSink | 接收品質控制訊息之物件的指標。 |
| m_RendererLock | 串流鎖定。 |
| m_RenderEvent | 用來排程轉譯的事件。 |
| m_SignalTime | 停止目前範例的時間。 |
| m_ThreadSignal | 用來釋放串流執行緒的事件。 |
| 公用方法 | Description |
| CancelNotification | 取消排程轉譯的計時器事件。 虛擬。 |
| CBaseRenderer | 建構函式方法。 |
| ~CBaseRenderer | 解構函式方法。 |
| GetMediaPositionInterface | 擷取篩選準則的 IMediaPosition 和 IMediaSeeking 介面指標。 虛擬。 |
| GetPin | 擷取針腳。 虛擬。 |
| GetPinCount | 擷取針腳數目。 虛擬。 |
| GetSampleTimes | 從範例擷取時間戳記。 虛擬。 |
| OnDisplayChange | 將 EC_DISPLAY_CHANGED 事件張貼至篩選圖表管理員。 |
| PrepareReceive | 準備呈現範例。 虛擬。 |
| 接收 | 接收資料流程中的下一個媒體範例。 虛擬。 |
| 轉譯 | 轉譯範例。 虛擬。 |
| ScheduleSample | 排程用於轉譯的範例。 虛擬。 |
| SendNotifyWindow | 通知視訊視窗控制碼的上游篩選。 |
| SendRepaint | 將重新繪製事件傳送至篩選圖形管理員。 |
| SetMediaType | 設定針腳的媒體類型時呼叫。 虛擬。 |
| SignalTimerFired | 清除用來排程轉譯的計時器識別碼。 |
| SourceThreadCanWait | 保留或釋放串流執行緒。 虛擬。 |
| WaitForReceiveToComplete | 等候 CBaseRenderer::Receive 方法完成。 |
| WaitForRenderTime | 等候目前範例的簡報時間。 虛擬。 |
| 公用方法:存取子方法 | Description |
| ClearPendingSample | 釋放目前的範例。 虛擬。 |
| GetCurrentSample | 擷取目前的範例。 虛擬。 |
| GetRealState | 擷取篩選狀態。 |
| GetRenderEvent | 擷取排程轉譯的事件。 |
| HaveCurrentSample | 判斷篩選準則是否有範例。 虛擬。 |
| IsEndOfStream | 查詢是否收到資料流程結束通知。 |
| IsEndOfStreamDelivered | 查詢是否已將EC_COMPLETE事件傳遞至篩選圖形管理員。 |
| IsStreaming | 查詢篩選準則是否為串流資料。 |
| SetAbortSignal | 設定旗標,指出是否要停止轉譯並拒絕進一步的樣本。 |
| SetRepaintStatus | 啟用或停用重新繪製事件。 |
| 公用方法:State-Change方法 | Description |
| 使用中 | 當狀態切換為暫停或執行時呼叫。 虛擬。 |
| BeginFlush | 開始排清作業。 虛擬。 |
| BreakConnect | 從連接釋放輸入針腳。 虛擬。 |
| CheckReady | 查詢狀態轉換是否完成。 |
| CompleteConnect | 完成與另一個針腳的輸入針腳連線。 虛擬。 |
| CompleteStateChange | 判斷是否完成轉換至暫停狀態。 虛擬。 |
| EndFlush | 結束排清作業。 虛擬。 |
| 非使用中 | 當狀態切換為已停止時呼叫。 虛擬。 |
| NotReady | 表示狀態轉換尚未完成。 |
| 就緒 | 表示狀態轉換已完成。 |
| StartStreaming | 當篩選切換至執行中狀態時,起始串流。 虛擬。 |
| StopStreaming | 當篩選參數離開執行中狀態時,停止串流。 虛擬。 |
| 公用方法:資料流程結束方法 | Description |
| EndOfStream | 通知輸入針腳收到資料流程結束通知的篩選。 虛擬。 |
| NotifyEndOfStream | 將 EC_COMPLETE 事件張貼至篩選圖形管理員。 |
| ResetEndOfStream | 重設資料流程結尾旗標。 |
| ResetEndOfStreamTimer | 取消排程EC_COMPLETE通知的計時器。 虛擬。 |
| SendEndOfStream | 如果已達到資料流程結尾,請排程篩選圖形管理員的EC_COMPLETE事件。 虛擬。 |
| TimerCallback | 資料流程結束計時器事件的回呼方法。 |
| 公用方法:處理常式 | Description |
| OnReceiveFirstSample | 當篩選在暫停時收到範例時呼叫。 虛擬。 |
| OnRenderEnd | 在轉譯範例之後呼叫。 虛擬。 |
| OnRenderStart | 轉譯即將啟動時呼叫。 虛擬。 |
| OnStartStreaming | 當篩選開始串流時呼叫。 虛擬。 |
| OnStopStreaming | 當篩選準則停止串流時呼叫。 虛擬。 |
| OnWaitEnd | 當篩選完成等候範例的簡報時間時呼叫。 虛擬。 |
| OnWaitStart | 當篩選準則開始等候範例的簡報時間時呼叫。 虛擬。 |
| PrepareRender | 在篩選轉譯範例之前呼叫。 虛擬。 |
| ShouldDrawSampleNow | 決定如何排程範例以進行轉譯。 虛擬。 |
| 純虛擬方法 | Description |
| CheckMediaType | 判斷篩選準則是否接受特定媒體類型。 |
| DoRenderSample | 轉譯範例。 |
| IMediaFilter 方法 | Description |
| GetState | 擷取篩選 (執行、停止或暫停) 的狀態。 |
| 暫停 | 暫停篩選。 |
| 執行 | 執行篩選。 |
| 停止 | 停止篩選。 |
| IBaseFilter 方法 | Description |
| FindPin | 擷取具有指定識別碼的針腳。 |
規格需求
| 需求 | 值 |
|---|---|
| 標頭 |
|
| 程式庫 |
|