結合影片擷取和預覽
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、IMFMediaEngine和媒體基金會中的 音訊/視訊擷取所取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
前幾節說明如何將視訊擷取到各種文件格式。 預覽影片 一節說明如何建置即時預覽圖表。 不過,許多應用程式必須同時執行這兩個動作。 若要建置合併的預覽和檔案寫入圖表,只需進行兩次呼叫 ICaptureGraphBuilder2::RenderStream。
// Render the preview stream to the video renderer.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
NULL, NULL);
// Render the capture stream to the mux.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap,
NULL, pMux);
在此程式代碼中,擷取圖形產生器會隱藏一些詳細資料:
如果擷取篩選器具有預覽引腳或視訊埠引腳,加上擷取引腳,那麼 RenderStream 方法會簡單地呈現這兩個引腳,如下圖所示。
如果過濾器只有捕捉插腳,捕捉圖表生成器會使用 Smart Tee 過濾器來分割捕捉流。 下圖顯示具有 Smart Tee 的圖表。
Smart Tee 濾鏡具有擷取端點和預覽端點。 它會從擷取篩選器取得單一視訊串流,並將其分割成兩個數據流,一個用於擷取,一個用於預覽。 為了維持擷取端的輸送量,預覽端會視需要省略畫面幀。 它也會在傳遞之前,先從每個樣本中去除時間戳,這是因為在 DirectShow 影片擷取篩選主題中所討論的原因。
雖然 Smart Tee 會分割數據流,但它不會實際複製視訊數據。 相反地,它會使用共用緩衝區的自定義媒體範例物件。 範例會標示為「只讀」,以確保下游篩選不會寫入數據。
如果您的擷取圖形有預覽視窗,有數件事可能會導致 Filter Graph Manager 停止整個圖形,包括擷取數據流:
- 鎖定計算機。
- 在屬於網域成員的計算機上按 CTRL+ALT+DELETE。
- 執行全螢幕 Direct3D 應用程式,例如遊戲或螢幕保護程式。
- 切換監視器或變更顯示器解析度。
- 執行會導致 Windows 顯示使用者帳戶控制 (UAC) 對話框的程式。 (Windows Vista 或更新版本。
- 執行全螢幕 DOS 視窗。
上述任何事件都可能會中斷擷取會話,可能會導致數據遺失。 (以下是內部發生的情況:視訊轉譯器會遺失所需的 Direct3D 或 DirectDraw 資源。在復原這些資源的過程中,影片轉譯器必須與上游篩選重新連線,導致 Filter Graph Manager 停止圖形。
此問題的兩個可能解決方案如下:
- 請勿包含預覽串流。 不過,請注意,當擷取裝置有視訊埠接腳時,ICaptureGraphBuilder2::RenderStream 方法會自動新增預覽視窗。 請參閱檔案擷取 中的視訊埠接腳。
- 使用數據流緩衝區引擎,將預覽串流傳送至另一個進程中的圖形。
相關主題