Share via


ICaptureGraphBuilder2::RenderStream 方法 (strmif.h)

[與此頁面相關的功能 DirectShow 是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft 強烈建議新程式代碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式代碼盡可能重寫為使用新的 API。

方法會將 RenderStream 來源篩選上的輸出針腳連接到接收篩選器,選擇性地透過中繼篩選。

語法

HRESULT RenderStream(
  [in] const GUID  *pCategory,
  [in] const GUID  *pType,
  [in] IUnknown    *pSource,
  [in] IBaseFilter *pfCompressor,
  [in] IBaseFilter *pfRenderer
);

參數

[in] pCategory

GUID 的指標,指定 Pin 屬性集中所列的其中一個針腳類別。 若要比對任何針腳,不論類別為何,請將此參數設定為 NULL。 一般值包括下列各項。

  • PIN_CATEGORY_CAPTURE
  • PIN_CATEGORY_PREVIEW
  • PIN_CATEGORY_CC

[in] pType

主要類型 GUID 的指標,指定輸出針腳的媒體類型;或 NULL 表示使用任何釘選,不論媒體類型為何。 如需可能值的清單,請參閱 主要類型

[in] pSource

指定連接起始篩選的指標,或指定輸出針腳的指標。

[in] pfCompressor

中繼篩選條件之 IBaseFilter 介面的指標,例如壓縮篩選器。 可以是 NULL

[in] pfRenderer

接收篩選條件的 IBaseFilter 介面指標,例如轉譯器或多任務篩選器。 如果值為 NULL,此方法會使用預設轉譯器 (請參閱) 。

傳回值

傳回 HRESULT 值。 可能的傳回值包括下列專案。

傳回碼 描述
S_OK
成功。
VFW_S_NOPREVIEWPIN
預覽是透過 Smart Tee篩選轉譯。
E_FAIL
失敗。
E_INVALIDARG
無效引數。
E_POINTER
NULL 指標自變數。
VFW_E_NOT_IN_GRAPH
篩選條件不在篩選圖形中。 如果您未呼叫 AddFilter 以將 pSourcepIntermediatepSink 新增至圖形,就會發生此錯誤。 如果您未呼叫 SetFiltergraph 將圖形連線到擷取圖形產生器,也可能會發生此情況;在此情況下,擷取圖形產生器物件會自動建立自己的篩選圖形。 請參閱 關於擷取圖形產生器

備註

此方法會藉由將鏈結中的兩個或多個篩選連接在一起來轉譯數據流:

  • pSource 參數會指定鏈結的開頭,可以是篩選或輸出針腳。
  • pIntermediate 參數會指定中繼篩選,通常是壓縮篩選。 此參數可以是 Null
  • pSink 參數會指定鏈結結尾的篩選。 一般而言,此篩選是預覽的轉譯器,或是用於檔案擷取的多任務。
方法會將 pSource 連接到 pIntermediate,然後將 pIntermediate 連接到 pSink。 如果 pIntermediateNULL,此方法只會將 pSource 連接到 pSinkpSourcepIntermediatepSink 所指定的所有篩選,都必須在呼叫 方法之前新增至圖形。 方法會使用 Intelligent Connect,因此可能會將譯碼器等其他篩選新增至圖表。

如果 pSink 參數為 NULL,此方法會嘗試使用預設轉譯器。 對於視訊,它會使用 影片轉譯器,而對於音訊,則會使用 DirectSound 轉譯器

如果 pSource 是篩選條件,此方法會在該篩選上搜尋輸出釘選。 在此情況下,請使用 pCategorypType 參數來縮小搜尋範圍。 例如,如果篩選有個別的釘選以進行預覽和擷取,您可以指定PIN_CATEGORY_CAPTURE或PIN_CATEGORY_PREVIEW。 如果 pSource 是輸出針腳,請將 pCategorypType 設定為 NULL

在所有情況下,方法都會搜尋未連接的針腳。 如果一個以上的針腳符合指定的準則,此方法會使用它找到的第一個這類針腳。

請注意,針對 DV 擷取,如果媒體類型MEDIATYPE_Interleaved且 pSink 參數為 NULL,此方法會將交錯串流分割成音訊數據流和視訊數據流,並轉譯這兩個數據流。

方法 RenderStream 會處理擷取圖表所需的許多詳細數據:

Smart Tee。 某些擷取篩選條件有擷取針腳,但沒有預覽釘選。 若要預覽,擷取針腳必須連線到 Smart Tee 篩選器。 此篩選會將數據分割成兩個數據流、擷取數據流和預覽數據流。 當您指定PIN_CATEGORY_PREVIEW或PIN_CATEGORY_CAPTURE時,方法會在需要時插入Smart Tee篩選。 然後,它會在Smart Tee篩選上呈現指定的數據流。 如果您轉譯預覽數據流,而方法會使用Smart Tee篩選條件,則會傳回VFW_S_NOPREVIEWPIN。

隱藏式輔助字幕。 您可以使用這個方法來擷取或預覽隱藏式輔助字幕。 有些擷取篩選會提供垂直空白間隔 (VBI) 數據,其他則提供隱藏式輔助字幕數據。 若要處理任一種情況,請呼叫 方法兩次,一次使用 PIN_CATEGORY_VBI,一次使用 PIN_CATEGORY_CC。 方法會插入將 VBI 數據轉換成隱藏式輔助字幕所需的任何篩選。 若要預覽數據,請將 pSink 參數設定為 NULL。 若要將數據擷取至檔案,請使用多任務篩選器的 IBaseFilter 介面指標。 您可以在相同的圖表中擷取和預覽數據。 使用 NULL 再再次使用多任務器呼叫 方法。 將 pIntermediate 參數設定為 NULL

視訊埠針腳。 使用視訊埠延伸模組的篩選 (VPE) 視訊擷取硬體可能會有視訊埠針腳 (PIN_CATEGORY_VIDEOPORT) 而非預覽釘選。 若要讓預覽或擷取能夠運作,視訊埠針腳必須連線到 重迭混音器篩選器。 方法會處理此詳細數據。 您不需要指定PIN_CATEGORY_VIDEOPORT。 指定PIN_CATEGORY_PREVIEW或PIN_CATEGORY_CAPTURE,方法會正確連接針腳。 以類似的方式,某些篩選會使用視訊埠釘選 (PIN_CATEGORY_VIDEOPORT_VBI) 來傳遞 VBI 數據。 如同PIN_CATEGORY_VIDEOPORT,方法會處理此詳細數據。 您不需要指定PIN_CATEGORY_VIDEOPORT_VBI。

支持篩選。 如果擷取裝置使用 Windows 驅動程式模型 (WDM) 驅動程式,圖表可能需要 來自 WDM 視訊擷取篩選器的上游篩選,例如 電視微調器 篩選或 類比視訊交叉條篩選。 如果這個方法成功轉譯數據流,它也會插入圖形中所需的任何 WDM 篩選。 方法會查詢擷取篩選上的輸入針腳,以判斷其支持的媒體,並將其聯機到相符的篩選條件。

範例程序代碼

針對典型的擷取圖形,將預覽釘選連接到預設轉譯器,而沒有中繼篩選:
C++
// Video: 
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
    pCaptureFilter, NULL, NULL); 
// Audio:
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, 
    pCaptureFilter, NULL, NULL); 
視您想要輸出的檔類型而定,將擷取釘選連接到多任務篩選器或檔案寫入器篩選。 針對 AVI 檔案,請使用 AVI Mux 篩選器。 針對 ASF 檔案,請使用 WM ASF 寫入器 篩選。 一般而言,您會從 ICaptureGraphBuilder2::SetOutputFileName 方法的 ppf 參數取得此篩選的指標。
C++
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\Example.avi", 
    &ppf, &pSink);
pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
    pCaptureFilter, NULL, ppf);

檔案來源

您可以使用這個方法來轉碼或重新壓縮檔案。 下列討論假設檔案最多有一個視訊串流和一個音訊數據流,或是單一交錯數據流。 否則,方法將無法正常運作。

檔案來源有一個輸出針腳,因此請將 pCategorypType 設定為 NULL。 呼叫 方法兩次—一次轉譯視訊數據流,一次轉譯音訊數據流。 第一次呼叫會將來源篩選連接到剖析器篩選,並轉譯其中一個剖析器篩選的輸出針腳。 第二個呼叫會轉譯剖析器的其餘輸出針腳。 如果您要壓縮一個數據流,但不壓縮另一個數據流,請務必在第一次呼叫中指定壓壓篩選器。 方法會根據壓縮類型自動挑選正確的數據流。

C++
pBuilder->RenderStream(NULL, NULL, pSrc, pCompressor, pMux);
pBuilder->RenderStream(NULL, NULL, pSrc, NULL, pMux);
如需完整範例,請參閱 重新壓縮 AVI 檔案

規格需求

需求
目標平台 Windows
標頭 strmif.h (包含 Dshow.h)
程式庫 Strmiids.lib

另請參閱

使用擷取圖形產生器建置圖形

錯誤和成功碼

ICaptureGraphBuilder2 介面

影片擷