從 Type-2 檔案傳輸
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
若要在預覽時傳輸 type-2 檔案,請使用下圖所示的篩選圖表。
type-2 檔案有兩個數據流、一個音訊串流和一個 DV 編碼的視訊串流。 此圖表使用 DV Muxer 篩選來合併音訊和視訊串流。 它會將交錯資料流程傳送至 MSDV 篩選,但會再次分割資料流程以供預覽。
建置此圖表,如下所示:
// Add the DV Mux filter to the graph.
IBaseFilter *pDVMux;
hr = CoCreateInstance(CLSID_DVMux, 0, CLSCTX_INPROC_SERVER
IID_IBaseFilter, reinterpret_cast<void**>)(&pDVMux));
hr = pGraph->AddFilter(pDVMux, L"DV Mux");
// Add the File Source filter to the graph.
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(L"C:\\Example2.avi", L"Source",
&pFileSource);
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pDVMux);
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pDVMux);
// Add the Infinite Pin Tee filter to the graph.
IBaseFilter *pTee;
hr = CoCreateInstance(CLSID_InfTee, 0, CLSCTX_INPROC_SERVER
IID_IBaseFilter, reinterpret_cast<void**>)(&pTee));
hr = pGraph->AddFilter(pTee, L"Tee");
hr = pBuilder->RenderStream(0, 0, pDVMux, 0, pTee);
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pTee, 0, 0);
此程式碼會呼叫 RenderStream:
前兩個會將來源篩選準則連接到 AVI 分割器,並將 AVI 分割器連接到 DV Mux。 在第一次呼叫中,擷取圖形產生器會自動將 AVI 分割器新增至圖形,並將其中一個 AVI 分割器的輸出針腳連接到 DV Mux。 在第二次呼叫中,擷取圖形產生器會尋找 AVI 分割器的第二個輸出針腳,並將它連接到 DV Mux。
RenderStream的第三個呼叫會將 DV Muxer 連接到無限針腳 Tee 篩選準則。 下一個呼叫會將一個資料流程從 Infinite Pin Tee 連接到 MSDV 擷取篩選器。 此資料流程會傳輸至裝置。 RenderStream的最後一次呼叫會建置圖形的預覽區段。
如果您不想在傳輸時預覽,您可以省略無限針腳 Tee,並直接將 DV Mux 連線到 MSDV 篩選器:
hr = pBuilder->RenderStream(0, 0, pDVMux, 0, pDV);
相關主題