共用方式為


結合影片擷取和預覽

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine和媒體基金會中的 音訊/視訊擷取所取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 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 的圖表。

    使用智慧型T形篩選器擷取和預覽圖表

Smart Tee 濾鏡具有擷取端點和預覽端點。 它會從擷取篩選器取得單一視訊串流,並將其分割成兩個數據流,一個用於擷取,一個用於預覽。 為了維持擷取端的輸送量,預覽端會視需要省略畫面幀。 它也會在傳遞之前,先從每個樣本中去除時間戳,這是因為在 DirectShow 影片擷取篩選主題中所討論的原因。

雖然 Smart Tee 會分割數據流,但它不會實際複製視訊數據。 相反地,它會使用共用緩衝區的自定義媒體範例物件。 範例會標示為「只讀」,以確保下游篩選不會寫入數據。

如果您的擷取圖形有預覽視窗,有數件事可能會導致 Filter Graph Manager 停止整個圖形,包括擷取數據流:

  • 鎖定計算機。
  • 在屬於網域成員的計算機上按 CTRL+ALT+DELETE。
  • 執行全螢幕 Direct3D 應用程式,例如遊戲或螢幕保護程式。
  • 切換監視器或變更顯示器解析度。
  • 執行會導致 Windows 顯示使用者帳戶控制 (UAC) 對話框的程式。 (Windows Vista 或更新版本。
  • 執行全螢幕 DOS 視窗。

上述任何事件都可能會中斷擷取會話,可能會導致數據遺失。 (以下是內部發生的情況:視訊轉譯器會遺失所需的 Direct3D 或 DirectDraw 資源。在復原這些資源的過程中,影片轉譯器必須與上游篩選重新連線,導致 Filter Graph Manager 停止圖形。

此問題的兩個可能解決方案如下:

  • 請勿包含預覽串流。 不過,請注意,當擷取裝置有視訊埠接腳時,ICaptureGraphBuilder2::RenderStream 方法會自動新增預覽視窗。 請參閱檔案擷取 中的視訊埠接腳。
  • 使用數據流緩衝區引擎,將預覽串流傳送至另一個進程中的圖形。

將影片錄製至檔案