結合影片擷取和預覽
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對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 停止 graph.)
此問題的兩個可能解決方案如下:
- 請勿包含預覽資料流程。 不過,請注意,當擷取裝置有視訊埠釘選時, ICaptureGraphBuilder2::RenderStream 方法會自動新增預覽視窗。 請參閱 檔案擷取中的視訊埠釘選。
- 使用資料流程緩衝區引擎,將預覽資料流程傳送至另一個進程中的圖形。
相關主題