ICaptureGraphBuilder2::RenderStream 方法 (strmif.h)

[與此頁面相關的功能 DirectShow 是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft 強烈建議新程式代碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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 以將 pSource、 pIntermediate 或 pSink 新增至圖形,就會發生此錯誤。 如果您未呼叫 SetFiltergraph 將圖形連線到擷取圖形產生器,也可能會發生此情況;在此情況下,擷取圖形產生器物件會自動建立自己的篩選圖形。 請參閱 關於擷取圖形產生器。

備註

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

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

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

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

檔案來源

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

檔案來源有一個輸出針腳,因此請將 pCategory 和 pType 設定為 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 介面

影片擷