從 Type-1 檔案傳輸
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]
若要在預覽檔案時傳輸 type-1 檔案,請使用下圖中顯示的篩選圖表。
此圖表中的篩選包括:
- AVI 分割器會剖析 AVI 檔案。 如果是 type-1 DV 檔案,輸出針腳會傳遞交錯的 DV 範例。
- Infinite Pin Tee篩選器會將交錯的 DV 分割成傳輸資料流程和預覽串流。 這兩個數據流都包含相同的交錯資料。 (此圖表會使用 Infinite Pin Tee 而非 Smart Tee,因為從檔案讀取時不會有卸載畫面的危險,因為有即時擷取。)
- DV 分割器會將交錯串流分割成 DV 視訊資料流程,該資料流程是由DV 視訊解碼器解碼,以及音訊串流解碼。 這兩個數據流都會轉譯為預覽。
建置此圖表,如下所示:
ICaptureGraphBuilder2 *pBuilder; // Capture graph builder.
IBaseFilter *pDV; // DV capture filter (MSDV)
// Initialize pDV (not shown).
// Create and initialize the Capture Graph Builder (not shown).
// 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");
// Add the File Source filter to the graph.
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(
L"C:\\YourFileNameHere.avi",
L"Source",
&pFileSource);
// Add the AVI Splitter filter to the graph.
IBaseFilter *pAviSplit;
hr = CoCreateInstance(CLSID_AviSplitter, 0, CLSCTX_INPROC_SERVER
IID_IBaseFilter, reinterpret_cast<void**>)(&pAviSplit));
hr = pGraph->AddFilter(pAviSplit, L"AVI Splitter");
// Connect the file source to the AVI Splitter.
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pAviSplit);
if (FAILED(hr))
{
// This is not an AVI file.
}
// Connect the file source to the Infinite Pin Tee.
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pAviSplit, 0, pTee);
if (FAILED(hr))
{
// This is not a type-1 DV file.
}
// Render one stream from the Infinite Pin Tee to MSDV, for transmit.
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);
// Render another stream from the Infinite Pin Tee for preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
- 呼叫 IGraphBuilder::AddSourceFilter ,將來源篩選新增至篩選圖形。
- 建立 AVI 分隔器和無限針腳 Tee,並將其新增至圖形。
- 呼叫 ICaptureGraphBuilder2::RenderStream ,將來源篩選連線至 AVI 分割器。 指定MEDIATYPE_Interleaved,以確保如果來源檔案不是 type-1 DV 檔案,方法就會失敗。 在此情況下,您可以反轉並嘗試改為建置類型 2 傳輸圖形。
- 再次呼叫 RenderStream ,將交錯資料流程從 AVI 分割器路由傳送到無限針腳 Tee
- 第三次呼叫 RenderStream,將一個串流從 Infinite Pin Tee 路由傳送至 MSDV 篩選器,以傳輸至裝置。
- 上次呼叫 RenderStream 一次,以建置圖形的預覽區段。
如果您不想要預覽,只要將檔案來源連線到 MSDV 篩選器即可:
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);
相關主題