共用方式為


結合影片擷取和預覽

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對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 的圖表。

    使用智慧型 tee 篩選來擷取和預覽圖表

Smart Tee 篩選器具有擷取釘選和預覽釘選。 它會從擷取篩選取得單一視訊串流,並將其分割成兩個數據流,一個用於擷取,另一個用於預覽。 為了在擷取釘選上維護輸送量,預覽釘選會視需要卸載畫面格。 它也會從每個範例移除時間戳記,再傳遞時間戳記,因為 DirectShow 影片擷取篩選主題中討論的原因。

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

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

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

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

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

將影片擷取至檔案