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 值。 可能的傳回值包括下列專案。
傳回碼 | 描述 |
---|---|
|
成功。 |
|
預覽是透過 Smart Tee篩選轉譯。 |
|
失敗。 |
|
無效引數。 |
|
NULL 指標自變數。 |
|
篩選條件不在篩選圖形中。 如果您未呼叫 AddFilter 以將 pSource、 pIntermediate 或 pSink 新增至圖形,就會發生此錯誤。 如果您未呼叫 SetFiltergraph 將圖形連線到擷取圖形產生器,也可能會發生此情況;在此情況下,擷取圖形產生器物件會自動建立自己的篩選圖形。 請參閱 關於擷取圖形產生器。 |
備註
此方法會藉由將鏈結中的兩個或多個篩選連接在一起來轉譯數據流:
- pSource 參數會指定鏈結的開頭,可以是篩選或輸出針腳。
- pIntermediate 參數會指定中繼篩選,通常是壓縮篩選。 此參數可以是 Null。
- pSink 參數會指定鏈結結尾的篩選。 一般而言,此篩選是預覽的轉譯器,或是用於檔案擷取的多任務。
如果 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); |
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); |
規格需求
需求 | 值 |
---|---|
目標平台 | Windows |
標頭 | strmif.h (包含 Dshow.h) |
程式庫 | Strmiids.lib |