處理視訊擷取中的重繪事件
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
如果您在不使用 ICaptureGraphBuilder2 介面的情況下建置視訊擷取圖形,並使用舊的影片轉譯器篩選器預覽影片,則您應該覆寫 EC_REPAINT 事件的預設處理。 查詢 IMediaEvent 介面的 Filter Graph 管理員,並使用值呼叫 IMediaEvent::CancelDefaultHandling 方法EC_REPAINT:
IMediaEvent *pEvent = 0;
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (SUCCEEDED(hr))
{
pEvent->CancelDefaultHandling (EC_REPAINT);
pEvent->Release();
}
這可防止可能損毀擷取檔案的錯誤。 如果使用者涵蓋併發現預覽視窗,影片轉譯器篩選器會收到WM_PAINT訊息。 根據預設,影片轉譯器會要求新的畫面,而篩選圖形管理員會暫停圖形,以提示另一個視訊畫面。 如果圖形正在寫入檔案時發生此情況,則會損毀檔案。 覆寫預設EC_REPAINT行為可防止轉譯器要求新的框架。
如果您使用 ICaptureGraphBuilder2 介面,就不需要執行此步驟,因為擷取圖形產生器會自動為您執行此步驟。 此外,如果您使用影片混合轉譯器 (VMR) 進行預覽,則不需要它。 VMR 一律有最新的畫面可用,因此不會傳送EC_REPAINT事件。
相關主題